Dalam tutorial ini, anda akan belajar mengenai penjana JavaScript dengan bantuan contoh.
Dalam JavaScript, penjana menyediakan cara baru untuk bekerja dengan fungsi dan iterator.
Menggunakan penjana,
- anda boleh menghentikan pelaksanaan fungsi dari mana sahaja di dalam fungsi
- dan terus melaksanakan kod dari kedudukan terhenti
Buat Penjana JavaScript
Untuk membuat penjana, anda perlu terlebih dahulu menentukan fungsi penjana dengan function*
simbol. Objek fungsi penjana dipanggil penjana.
// define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();
Catatan : Fungsi penjana dilambangkan dengan *
. Anda boleh menggunakan function* generatorFunc() (… )
atau function *generatorFunc()(… )
membuatnya.
Menggunakan hasil untuk Menjeda Pelaksanaan
Seperti yang disebutkan di atas, anda dapat menghentikan sebentar pelaksanaan fungsi generator tanpa menjalankan seluruh fungsi tubuh. Untuk itu, kami menggunakan yield
kata kunci. Sebagai contoh,
// generator function function* generatorFunc() ( console.log("1. code before the first yield"); yield 100; console.log("2. code before the second yield"); yield 200; ) // returns generator object const generator = generatorFunc(); console.log(generator.next());
Pengeluaran
1. kod sebelum hasil pertama (nilai: 100, selesai: salah)
Di sini,
- Objek penjana bernama
generator
dibuat. - Apabila
generator.next()
dipanggil, kod hingga yang pertamayield
dijalankan. Apabilayield
ditemui, program mengembalikan nilai dan menghentikan fungsi penjana.
Catatan : Anda perlu menetapkan objek penjana kepada pemboleh ubah sebelum menggunakannya.
Mengendalikan Penyata Hasil berganda
The yield
ungkapan mengembalikan nilai. Namun, tidak seperti return
pernyataan itu, ia tidak menghentikan program. Itulah sebabnya anda boleh terus melaksanakan kod dari kedudukan hasil terakhir. Sebagai contoh,
function* generatorFunc() ( console.log("1. code before first yield"); yield 100; console.log("2. code before the second yield"); yield 200; console.log("3. code after the second yield"); ) const generator = generatorFunc(); console.log(generator.next()); console.log(generator.next()); console.log(generator.next());
Pengeluaran
1. kod sebelum hasil pertama (nilai: 100, selesai: salah) 2. kod sebelum hasil kedua (nilai: 200, selesai: salah) (nilai: tidak ditentukan, selesai: benar)
Inilah cara program ini berfungsi.
generator.next()
Pernyataan pertama melaksanakan kod hingga pernyataan hasil pertama dan menghentikan pelaksanaan program.- Yang kedua
generator.next()
memulakan program dari kedudukan berhenti. - Apabila semua elemen diakses, ia akan kembali (nilai: tidak ditentukan, selesai: benar).

Menyampaikan Hujah ke Fungsi Penjana
Anda juga boleh menyampaikan argumen ke fungsi penjana. Sebagai contoh,
// generator function function* generatorFunc() ( // returns 'hello' at first next() let x = yield 'hello'; // returns passed argument on the second next() console.log(x); console.log('some code'); // returns 5 on second next() yield 5; ) const generator = generatorFunc(); console.log(generator.next()); console.log(generator.next(6)); console.log(generator.next());
Pengeluaran
(nilai: "hello", selesai: salah) 6 sebilangan kod (nilai: 5, selesai: salah) (nilai: tidak ditentukan, selesai: benar)
Dalam program di atas,
- Yang pertama
generator.next()
mengembalikan nilaiyield
(dalam kes ini, 'hello'). Walau bagaimanapun, nilainya tidak diberikan kepada pemboleh ubah x inlet x = yield 'hello';
(nilai: "hello", selesai: false)
- Apabila
generator.next(6)
ditemui, kod sekali lagi bermula padalet x = yield 'hello';
dan argumen 6 diberikan kepada x. Juga, baki kod dilaksanakan hingga yang keduayield
.6 beberapa kod (nilai: 5, selesai: salah)
- Apabila yang ketiga
next()
dijalankan, program kembali (nilai: tidak ditentukan, selesai: benar). Ini kerana tidak ada pernyataan hasil yang lain.(nilai: tidak ditentukan, selesai: benar)
Penjana Digunakan untuk Melaksanakan Iterables
Penjana menyediakan cara yang lebih mudah untuk melaksanakan iterator.
Sekiranya anda ingin melaksanakan iterator secara manual, anda harus membuat iterator dengan next()
kaedah dan simpan keadaan. Sebagai contoh,
// creating iterable object const iterableObj = ( // iterator method (Symbol.iterator)() ( let step = 0; return ( next() ( step++; if (step === 1) ( return ( value: '1', done: false); ) else if (step === 2) ( return ( value: '2', done: false); ) else if (step === 3) ( return ( value: '3', done: false); ) return ( value: '', done: true ); ) ) ) ) for (const i of iterableObj) ( console.log(i); )
Pengeluaran
1 2 3
Oleh kerana penjana boleh berulang, anda boleh melaksanakan iterator dengan cara yang lebih mudah. Kemudian anda boleh berulang melalui generator menggunakan for… of
gelung. Sebagai contoh,
// generator function function* generatorFunc() ( yield 1; yield 2; yield 3; ) const obj = generatorFunc(); // iteration through generator for (let value of obj) ( console.log(value); )
Kaedah Penjana
Kaedah | Penerangan |
---|---|
next() | Mengembalikan nilai hasil |
return() | Mengembalikan nilai dan menghentikan penjana |
throw() | Melemparkan ralat dan menghentikan penjana |
Kata kunci pengembalian JavaScript menghasilkan Vs
kata kunci kembali | kata kunci hasil |
---|---|
Mengembalikan nilai dan menghentikan fungsi. | Mengembalikan nilai dan menghentikan fungsi tetapi tidak menghentikan fungsi. |
Terdapat dalam fungsi normal dan fungsi penjana. | Hanya terdapat dalam fungsi penjana. |
Fungsi Penjana JavaScript Dengan kembali
You can use the return
statement in a generator function. The return
statement returns a value and terminates the function (similar to regular functions). For example,
// generator function function* generatorFunc() ( yield 100; return 123; console.log("2. some code before second yield"); yield 200; ) // returns generator object const generator = generatorFunc(); console.log(generator.next()); console.log(generator.next()); console.log(generator.next());
Output
(value: 100, done: false) (value: 123, done: true) (value: undefined, done: true)
In the above program, when the return
statement is encountered, it returns the value and done
property becomes true
, and the function terminates. Hence, the next()
method after the return
statement does not return anything.
Note: You can also use the return()
method instead of the return
statement like generator.return(123);
in the above code.
JavaScript Generator Throw Method
Anda secara eksplisit boleh membuang kesalahan pada fungsi penjana menggunakan kaedah lontaran (). Penggunaan throw()
kaedah melemparkan ralat dan menghentikan fungsinya. Sebagai contoh,
// generator function function* generatorFunc() ( yield 100; yield 200; ) // returns generator object const generator = generatorFunc(); console.log(generator.next()); // throws an error // terminates the generator console.log(generator.throw(new Error('Error occurred.'))); console.log(generator.next());
Pengeluaran
(nilai: 1, selesai: salah) Ralat: Ralat berlaku.
Kegunaan Penjana
- Penjana membolehkan kami menulis kod yang lebih bersih semasa menulis tugas tak segerak.
- Penjana menyediakan cara yang lebih mudah untuk melaksanakan iterator.
- Penjana melaksanakan kodnya hanya apabila diperlukan.
- Penjana cekap ingatan.
Penjana diperkenalkan pada ES6 . Beberapa penyemak imbas mungkin tidak menyokong penggunaan penjana. Untuk mengetahui lebih lanjut, lawati sokongan Penjana JavaScript.