Apa perbedaan antara async.waterfall dan async.series

Jawaban:

168

Tampaknya async.waterfallmemungkinkan setiap fungsi meneruskan hasilnya ke fungsi berikutnya, sambil async.seriesmeneruskan semua hasil ke callback terakhir. Pada tingkat yang lebih tinggi, async.waterfallakan untuk pipeline data ("diberikan 2, kalikan dengan 3, tambahkan 2, dan bagi dengan 17"), sedangkan async.seriesakan untuk tugas-tugas terpisah yang harus dilakukan secara berurutan, tetapi sebaliknya.

Twisol
sumber
Apakah mungkin salah satu dari dua fungsi ini mengembalikan nilai? Saya telah membaca bahwa itu mungkin, tetapi saya tidak dapat menemukan informasi yang relevan di mana pun dalam dokumentasi.
Anderson Green
1
@AndersonGreen: Tidak. Melihat sumber pustaka, tidak waterfalljuga seriesmengembalikan nilai. Diharapkan bahwa apa pun hasilnya akan digunakan dalam parameter callback opsional.
Twisol
Jawaban di atas mungkin benar kembali ke tahun 2012, tetapi jawaban yang benar sama dengan jawaban berikutnya, yaitu: series () seperti yang dinamai SEMUA hasil sebagai rangkaian yang diteruskan ke panggilan balik Final, dan air terjun adalah hasil TERAKHIR yang diteruskan ke panggilan balik terakhir. Lihat Mozilla Developer
Jeb50
53

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.


sumber
1
Ini harus menjadi jawabannya ;-)
Stuart Allen
@ Mario "Kedua fungsi meneruskan panggilan balik dari fungsi sebelumnya" ATAU "Kedua fungsi meneruskan hasil dari fungsi sebelumnya"?
pengguna1451111
@ user1451111, Hasil, lol ... Saya yakin saya telah menulis itu pertama kali ...
26

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

Wayne Chiu
sumber
1
Gambar yang dibuat dengan luar biasa. Apakah Anda membuatnya sendiri atau mendapatkannya di tempat lain?
pengguna1451111
letakkan gambar di jawabannya, orang mungkin akan merindukannya o / w
Alexander Mills
1

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.autoInjectsebagai 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!

Alexander Mills
sumber