Spesifikasi draf ECMAScript 6 telah memberikan banyak hal menyenangkan 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 berjalan seiring dengan loop for..of
: fungsi generator.
Ada sekumpulan materi bagus yang membahas alasan dan cara 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 akan mulai kembali dan berlanjut, hingga yield
memiliki 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 memahami dasar-dasarnya, mari kita pelajari contoh JavaScript secara mendalam yang membahas beberapa masalah, atau “bagian rumit”, dalam menggunakan generator. Ada banyak komentar di seluruh kode, dan Anda dapat mencoba versi live kode sebelum membacanya:
Jadi, apa saja hal-hal penting yang dapat diambil dari kode ini?
Pertama, membuat 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 pemanggilan iterator sebelumnya. Ini adalah cara yang bagus untuk memvariasikan output 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 tanpa batas, pastikan Anda memiliki semacam kondisi terminal berdasarkan nilai yield
—sangat mudah untuk tidak sengaja menulis loop tanpa batas, terutama saat menggunakan for..of
untuk iterasi. Jika Anda menggunakan iterator terbatas melalui panggilan ke next()
, properti .done
dari objek yang ditampilkan akan menandakan apakah iterasi sudah selesai.
Kami harap contoh ini, beserta referensi lain yang tersedia di web, dapat memberikan beberapa hal menarik dan membuat Anda berpikir tentang cara menggunakan generator dalam kode Anda sendiri. Versi Firefox mulai dari 31 dan Chrome mulai dari 39 mendukung generator secara native. Project Regenerator menawarkan dukungan generator untuk browser lain, dan menggunakan Traceur juga merupakan opsi.
Terima kasih kepada Erik Arvidsson atas bantuannya dalam meninjau artikel ini.