Generator - bit rumit

Spesifikasi draf ECMAScript 6 telah menghasilkan banyak sumber kegembiraan bagi developer JavaScript modern. Kita telah membahas beberapa class koleksi baru dan loop iterasi for..of di postingan sebelumnya. Dalam postingan ini, kita akan membahas sesuatu yang berkaitan dengan loop for..of: fungsi generator.

Ada host materi bagus di luar sana yang membahas mengapa dan bagaimana menggunakan generator. Singkatnya, generator adalah fungsi khusus yang membuat iterator, dan iterator adalah objek yang memiliki metode next(), yang dapat dipanggil untuk mendapatkan nilai. Dalam fungsi generator, kata kunci yield memberikan nilai untuk next(). Penggunaan yield menangguhkan eksekusi fungsi generator, mempertahankan status hingga next() dipanggil lagi, pada saat itu kode mulai dicadangkan dan berlanjut, hingga yield mendapatkan nilai lain (atau hingga fungsi generator berakhir). Ada beberapa kasus penggunaan kanonis untuk fungsi generator, seperti menggunakannya untuk melakukan iterasi pada angka dalam urutan Fibonacci.

Setelah mengetahui dasar-dasarnya, mari kita bahas lebih dalam dengan contoh JavaScript yang mencakup beberapa gotcha, atau “gnarly bit”, dalam bekerja dengan generator. Ada banyak komentar di dalamnya, dan Anda dapat bermain-main dengan versi aktif kode tersebut sebelum membacanya:

Jadi, apa saja pelajaran penting dari kode ini?

Pertama, membangun generator akan menghasilkan iterator unik dengan statusnya sendiri yang berbeda, dan Anda dapat meneruskan parameter ke konstruktor generator yang dapat mengontrol perilaku.

Kedua, Anda dapat meneruskan parameter saat memanggil metode next() iterator, dan nilai tersebut akan ditetapkan ke apa pun yang ada di sisi kiri pernyataan yield dari panggilan iterator sebelumnya. Ini adalah cara yang tepat untuk memvariasikan {i>output<i} iterator—di sini, kita menggunakannya untuk mengontrol apakah kata yang dihasilkan dalam huruf besar atau tidak. Jika Anda ingin memengaruhi nilai pertama yang dihasilkan, lakukan melalui parameter ke konstruktor generator.

Terakhir, generator dapat menghasilkan iterator terbatas atau tak terbatas. Jika Anda menggunakan iterator tak terbatas, pastikan Anda memiliki semacam kondisi terminal berdasarkan nilai yield. Menulis loop tanpa batas secara tidak sengaja sangat mudah dilakukan, terutama saat menggunakan for..of untuk iterasi. Jika Anda menangani iterator terbatas melalui panggilan ke next(), properti .done dari objek yang ditampilkan akan memberi sinyal apakah iterasi sudah selesai.

Kami harap contoh ini, bersama dengan sumber daya lain yang tersedia di web, menghasilkan kegembiraan dan membuat Anda berpikir tentang bagaimana Anda dapat menggunakan generator dalam kode Anda sendiri. Versi Firefox yang dimulai dengan versi 31 dan Chrome dimulai dengan 39 generator dukungan secara native. Proyek Regenerator menawarkan dukungan generator untuk browser lain, dan penggunaan Traceur juga merupakan salah satu opsinya.

Terima kasih kepada Erik Arvidsson atas bantuannya dalam meninjau artikel ini.