Dalam tutorial ini, kita akan belajar tentang Generator dan perbedaannya dengan Callback
Apa itu generator?
Generator telah menjadi sangat terkenal di Node.js belakangan ini dan itu mungkin karena apa yang mampu mereka lakukan.
- Generator adalah eksekusi fungsi yang dapat ditangguhkan dan dilanjutkan di lain waktu.
- Generator berguna saat menjalankan konsep seperti 'eksekusi malas'. Ini pada dasarnya berarti bahwa dengan menangguhkan eksekusi dan melanjutkan sesuka hati, kita dapat menarik nilai hanya jika diperlukan.
Generator memiliki 2 metode utama di bawah ini
- Metode hasil - Metode hasil dipanggil dalam fungsi untuk menghentikan eksekusi fungsi pada baris tertentu di mana metode hasil dipanggil.
- Metode selanjutnya - Metode ini dipanggil dari aplikasi utama untuk melanjutkan eksekusi fungsi yang memiliki metode hasil. Eksekusi fungsi akan berlanjut hingga metode hasil berikutnya atau hingga akhir metode.
Mari kita lihat contoh bagaimana generator dapat digunakan.
Dalam contoh kita, kita akan memiliki fungsi Add sederhana yang akan menambahkan 2 angka, tetapi kita akan terus menghentikan eksekusi metode pada titik yang berbeda untuk menunjukkan bagaimana generator dapat digunakan.
function* Add(x) {yield x + 1;var y = yield(null);y = 6return x + y;}var gen = Add(5);gen.next();gen.next();
Penjelasan Kode: -
- Langkah pertama adalah mendefinisikan "fungsi" generator kita. Perhatikan bahwa ini dilakukan dengan menambahkan "*" ke kata kunci fungsi. Kami kemudian mendefinisikan fungsi yang disebut Add yang mengambil parameter x.
- Kata kunci hasil khusus untuk generator. Ini membuatnya menjadi konstruksi yang kuat untuk menjeda fungsi di tengah apa pun. Jadi di sini, eksekusi fungsi akan dihentikan sampai kita memanggil fungsi next (), yang akan dilakukan di Langkah4. Pada titik ini, nilai x akan menjadi 6 dan eksekusi fungsinya akan dihentikan.
- Di sinilah pertama kali kita memanggil fungsi generator dan mengirim nilai 5 ke fungsi Add kita. Nilai ini akan diganti dalam parameter x dari fungsi Add kita.
- Setelah kita memanggil fungsi next (), fungsi Add () akan melanjutkan eksekusi. Ketika pernyataan berikutnya var y = yield (null) akan dijalankan, fungsi Add () akan berhenti dijalankan lagi.
- Sekarang setelah memanggil fungsi next () lagi, pernyataan berikutnya akan dijalankan, dan nilai gabungan dari x = 5 dan y = 6 akan ditambahkan dan dikembalikan.
Callback vs. generator
Generator digunakan untuk memecahkan masalah yang dikenal sebagai neraka panggilan balik. Terkadang fungsi callback menjadi begitu bersarang selama pengembangan aplikasi Node.js sehingga menjadi terlalu rumit untuk menggunakan fungsi callback.
Di sinilah generator berguna. Salah satu contoh paling umum dari ini adalah saat membuat fungsi pengatur waktu.
Mari kita lihat contoh di bawah ini tentang bagaimana generator dapat terbukti berguna melalui callback.
Contoh kami hanya akan membuat fungsi penundaan waktu sederhana. Kami kemudian ingin memanggil fungsi ini yang menggabungkan penundaan 1000, 2000 dan 3000 ms.
Langkah 1) Tentukan fungsi panggilan balik kami dengan kode waktu tunda yang diperlukan.
function Timedelay(ptime, callback) {setTimeout(function() {callback("Pausing for " + ptime);}, time);}
Penjelasan Kode: -
- Di sini kita membuat fungsi yang disebut Timedelay dengan parameter yang disebut ptime. Ini akan memakan waktu tunda yang ingin kami perkenalkan di aplikasi kami.
- Langkah selanjutnya adalah membuat pesan, yang akan ditampilkan kepada pengguna yang mengatakan bahwa aplikasi akan dijeda selama beberapa milidetik ini.
Langkah 2) Sekarang mari kita lihat kode jika kita menggabungkan callback. Misalkan kita ingin menggabungkan callback berdasarkan nilai 1000, 2000 dan 3000 milidetik, kode di bawah ini menunjukkan bagaimana kita perlu mengimplementasikannya menggunakan callback.
Timedelay(1000, function(message) {console.log(msg);Timedelay(2000, function(message) {console.log(msg);Timedelay(3000, function(message) {console.log(msg);})})})
Penjelasan Kode: -
- Kami menyebut Timedelay sebagai callback dengan 1000 sebagai nilainya.
- Selanjutnya kami ingin memanggil fungsi Timedelay lagi dengan 2000 sebagai nilainya.
- Terakhir, kami ingin memanggil fungsi Timedelay lagi dengan nilai 3000.
Dari kode di atas, Anda dapat melihat bahwa itu menjadi lebih berantakan karena kami ingin mulai memanggil fungsi tersebut beberapa kali.
Langkah 3) Sekarang mari kita lihat bagaimana mengimplementasikan kode yang sama menggunakan generator. Dari kode di bawah ini Anda sekarang dapat melihat betapa sederhananya mengimplementasikan fungsi Timedelay menggunakan generator.
function* Messages() {console,log(yield(Timedelay(1000, function(){})));console,log(yield(Timedelay(2000, function(){})));console,log(yield(Timedelay(3000, function(){})));}
Penjelasan Kode: -
- Kami pertama kali mendefinisikan fungsi generator yang akan digunakan untuk memanggil fungsi Timedelay kami.
- Kami memanggil fungsi Yield bersama dengan fungsi Timedelay dengan 1000 sebagai nilai parameter.
- Kami kemudian memanggil fungsi Yield bersama dengan fungsi Timedelay dengan 2000 sebagai nilai parameter.
- Akhirnya, kita memanggil fungsi Yield bersama dengan fungsi Timedelay dengan 3000 sebagai nilai parameternya.
Ringkasan
Generator juga dapat digunakan untuk mengatasi masalah dengan callback bersarang dan membantu menghilangkan apa yang dikenal sebagai callback hell. Generator digunakan untuk menghentikan pemrosesan suatu fungsi. Ini dilakukan dengan menggunakan metode 'hasil' dalam fungsi asinkron.