Modul nodejs async: https://github.com/caolan/async menyediakan 2 metode serupa, async.waterfall
dan async.series
.
Apa perbedaan di antara keduanya?
Modul nodejs async: https://github.com/caolan/async menyediakan 2 metode serupa, async.waterfall
dan async.series
.
Apa perbedaan di antara keduanya?
Jawaban:
Tampaknya async.waterfall
memungkinkan setiap fungsi meneruskan hasilnya ke fungsi berikutnya, sambil async.series
meneruskan semua hasil ke callback terakhir. Pada tingkat yang lebih tinggi, async.waterfall
akan untuk pipeline data ("diberikan 2, kalikan dengan 3, tambahkan 2, dan bagi dengan 17"), sedangkan async.series
akan untuk tugas-tugas terpisah yang harus dilakukan secara berurutan, tetapi sebaliknya.
waterfall
juga series
mengembalikan nilai. Diharapkan bahwa apa pun hasilnya akan digunakan dalam parameter callback opsional.
Kedua fungsi meneruskan nilai kembali, dari setiap fungsi ke fungsi berikutnya, kemudian setelah selesai akan memanggil callback utama, meneruskan kesalahannya, jika terjadi kesalahan.
Perbedaannya adalah async.series()
, setelah rangkaian selesai, akan meneruskan semua hasil ke callback utama. async.waterfall()
akan meneruskan ke callback utama hanya hasil dari fungsi terakhir yang dipanggil.
async.waterfall()
berurusan dengan sebuah action that relies on the previous outcome
.
async.series()
berurusan dengan tindakan yang diinginkan see all the result at the end
Saya menganggap async.waterfall berbahaya, karena sulit untuk refactor setelah ditulis dan juga rawan kesalahan karena jika Anda memberikan lebih banyak argumen, fungsi lain banyak mengubah tanda tangan.
Saya sangat merekomendasikan async.autoInject
sebagai alternatif yang bagus, untuk air terjun async.
https://caolan.github.io/async/autoInject.js.html
Jika Anda memilih untuk menggunakan async.waterfall, saya sarankan untuk menyimpan semuanya dalam satu objek, sehingga fungsi Anda tidak harus mengubah panjang / tanda tangan, seperti:
peringatan: ini adalah pola yang buruk
async.waterfall([
cb => {
cb(null, "one", "two");
},
(one, two, cb) => {
cb(null, 1, 2, 3, 4);
},
(one,two,three,four,cb) => {
// ...
}
])
jangan lakukan dengan cara di atas. Ini adalah pola yang jauh lebih baik untuk digunakan:
async.waterfall([
cb => {
cb(null, {one:"one", two:"two"});
},
(v, cb) => {
cb(null, [1, 2, 3, 4]);
},
(v,cb) => {
// ...
}
])
dengan cara itu Anda tidak akan menarik rambut Anda mencoba untuk memastikan argumen fungsi memiliki panjang yang tepat. Fungsi pertama hanya menerima satu arg - callback. Semua yang tersisa harus menerima dua argumen - nilai dan callback. Tetap berpegang pada polanya dan Anda akan tetap waras!