Node.js Generators & Bandingkan dengan Callback
Dalam tutorial ini, kita akan belajar tentang Generators dan perbedaannya dengan Callback
Apa itu generator?
Generators telah menjadi cukup terkenal di Node.js belakangan ini dan itu mungkin karena kemampuan mereka.
- Generators adalah eksekusi fungsi yang dapat ditangguhkan dan dilanjutkan di titik berikutnya.
- Generators berguna ketika menjalankan konsep seperti 'eksekusi malas'. Ini pada dasarnya berarti bahwa dengan menunda eksekusi dan melanjutkan sesuka hati, kita dapat mengambil nilai hanya ketika diperlukan.
GeneratorKami memiliki 2 metode utama di bawah ini.
- Metode hasil – Metode hasil dipanggil dalam suatu 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 metode akhir.
Mari kita lihat contoh bagaimana generator dapat digunakan.
Dalam contoh kita, kita akan memiliki fungsi Tambah sederhana yang akan menambahkan 2 angka, tetapi kita akan terus menghentikan eksekusi metode di berbagai titik untuk menunjukkan bagaimana generator dapat digunakan.
function* Add(x) { yield x + 1; var y = yield(null); y = 6 return 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. Kita kemudian mendefinisikan fungsi bernama Add yang mengambil parameter x.
- Kata kunci yield khusus untuk generator. Hal ini menjadikannya konstruksi yang ampuh untuk menjeda fungsi di tengah-tengah apa pun. Jadi di sini, eksekusi fungsi akan dihentikan hingga kita memanggil fungsi next(), yang akan dilakukan di Langkah 4. Pada titik ini, nilai x akan menjadi 6 dan eksekusi fungsi akan dihentikan.
- Di sinilah kita pertama kali memanggil fungsi generator dan mengirim nilai 5 ke fungsi Add kita. Nilai ini akan disubstitusikan ke parameter x dari fungsi Add kita.
- Setelah kita memanggil fungsi next(), fungsi Add() akan melanjutkan eksekusi. Ketika pernyataan berikutnya var y= hasil(null) akan dieksekusi, fungsi Add() akan berhenti dijalankan lagi.
- Sekarang setelah memanggil fungsi next() lagi, pernyataan berikutnya akan dijalankan, dan nilai gabungan x=5 dan y=6 akan ditambahkan dan dikembalikan.
Panggilan balik vs. generator
Generators digunakan untuk memecahkan masalah yang dikenal sebagai callback hell. Terkadang fungsi panggilan balik menjadi sangat bertumpuk selama pengembangan aplikasi Node.js sehingga menjadi terlalu rumit untuk menggunakan fungsi panggilan balik.
Di sinilah generator berguna. Salah satu contoh paling umum adalah saat membuat fungsi pengatur waktu.
Mari kita lihat contoh di bawah ini tentang bagaimana generator dapat terbukti lebih berguna daripada panggilan balik.
Contoh kita hanya akan membuat fungsi waktu tunda sederhana. Kami kemudian ingin memanggil fungsi ini dengan 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 bernama Timedelay dengan parameter bernama ptime. Ini akan memerlukan penundaan waktu yang ingin kami perkenalkan dalam aplikasi kami.
- Langkah selanjutnya adalah membuat pesan, yang akan ditampilkan kepada pengguna yang mengatakan bahwa aplikasi akan dijeda selama beberapa milidetik.
Langkah 2) Sekarang mari kita lihat kodenya jika kita memasukkan callback. Misalkan kita ingin memasukkan 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 memanggil Timedelay sebagai panggilan balik dengan 1000 sebagai nilainya.
- Selanjutnya kita ingin memanggil fungsi Timedelay lagi dengan nilai 2000.
- Terakhir, kami ingin memanggil fungsi Timedelay lagi dengan nilai 3000.
Dari kode di atas, Anda dapat melihat bahwa ini menjadi lebih berantakan karena kita ingin mulai memanggil fungsi tersebut beberapa kali.
Langkah 3) Sekarang mari kita lihat cara mengimplementasikan kode yang sama menggunakan generator. Dari kode di bawah ini Anda dapat melihat betapa mudahnya 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
- Pertama-tama kita mendefinisikan fungsi generator yang akan digunakan untuk memanggil fungsi Timedelay kita.
- Kami memanggil fungsi Hasil bersama dengan fungsi Timedelay dengan 1000 sebagai nilai parameter.
- Kami kemudian memanggil fungsi Hasil bersama dengan fungsi Timedelay dengan 2000 sebagai nilai parameter.
- Terakhir, kita memanggil fungsi Yield bersama dengan fungsi Timedelay dengan 3000 sebagai nilai parameternya.
Ringkasan
Generators juga dapat digunakan untuk meringankan masalah dengan panggilan balik yang disarangkan dan membantu menghilangkan apa yang dikenal sebagai panggilan balik neraka. Generators digunakan untuk menghentikan pemrosesan suatu fungsi. Hal ini dilakukan dengan penggunaan metode 'yield' dalam fungsi asinkron.