Generator - bit rumit

Spesifikasi draf ECMAScript 6 telah membuahkan banyak 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 digunakan bersama dengan loop for..of: fungsi generator.

Sudah ada host materi bagus yang membahas alasan dan cara menggunakan generator. Secara singkat, 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, dan pada saat itu kode dimulai kembali dan berlanjut hingga yield mencapai nilai lain (atau hingga fungsi generator dihentikan). Ada beberapa kasus penggunaan kanonis untuk fungsi generator, seperti menggunakannya untuk melakukan iterasi pada angka dalam urutan Fibonacci.

Setelah mengetahui dasar-dasarnya, mari kita pelajari lebih dalam dengan contoh JavaScript yang mencakup beberapa getcha, atau “cara kerja yang sulit”, tentang bekerja dengan generator. Ada banyak komentar yang banyak, dan Anda dapat bermain-main dengan versi aktif kode sebelum membacanya:

Jadi, apa saja pelajaran besar yang diperoleh dari kode ini?

Pertama, membangun generator 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 pemanggilan iterator sebelumnya. Ini adalah cara yang bagus untuk memvariasikan output iterator—di sini, kita menggunakannya untuk mengontrol apakah kata yang dihasilkan ditulis 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 kondisi terminal berdasarkan nilai yielded. Sangat mudah untuk menulis loop tak terbatas secara tidak sengaja, terutama saat menggunakan for..of untuk iterasi. Jika Anda menggunakan iterator terbatas melalui panggilan ke next(), properti .done objek yang ditampilkan akan menandakan apakah iterasi telah selesai.

Kami harap contoh ini, beserta resource lain yang tersedia di web, dapat menyenangkan dan membuat Anda berpikir tentang bagaimana Anda dapat menggunakan generator di kode Anda sendiri. Versi Firefox dimulai dengan 31 dan Chrome yang dimulai dengan 39 generator dukungan. Project Regenerator menawarkan dukungan generator untuk browser lain, dan penggunaan Traceur juga merupakan pilihan.

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