Async.waterfall ve async.series arasındaki fark nedir


Yanıtlar:


168

Görünüşe göre async.waterfall, her işlevin sonuçlarını bir sonraki işleve aktarırken async.series, tüm sonuçları son geri aramaya aktarır. Daha yüksek bir seviyede, async.waterfallbir veri hattı için ("2 verildi, 3 ile çarp, 2 ekle ve 17 ile böl"), async.seriessırayla gerçekleştirilmesi gereken, ancak aksi takdirde ayrı olan ayrı görevler için olacaktır.


Bu iki işlevden herhangi birinin bir değer döndürmesi mümkün müdür? Mümkün olduğunu okudum, ancak ilgili bilgileri belgelerin hiçbir yerinde bulamıyorum.
Anderson Green

1
@AndersonGreen: Hayır. Kitaplık kaynağına bakıldığında, ne bir değer ne waterfallde seriesdöndürülür. Sonuç ne olursa olsun, isteğe bağlı geri arama parametresinde kullanılması beklenir.
Twisol

Yukarıdaki cevap 2012'ye kadar doğru olabilir, ancak doğru olanı bir sonrakiyle aynıdır: series () olarak adlandırıldığı için, Final geri aramasına geçen bir dizi olarak TÜM sonuçlanır ve şelale, son geri aramaya aktarılan SON sonuçtur. Son geri arama. Bkz Mozilla Geliştirici
Jeb50

53

Her iki işlev de her işlevin dönüş değerini bir sonrakine geçirir, sonra tamamlandığında ana geri aramayı çağırır ve bir hata olursa onun hatasını iletir.

Aradaki fark, async.series()seri bittikten sonra tüm sonuçları ana geri aramaya aktaracak olmasıdır. async.waterfall()ana geri aramaya yalnızca son çağrılan işlevin sonucunu aktarır.


1
Cevap bu olmalı ;-)
Stuart Allen

@Mario "Her iki işlev de önceki işlevin geri çağrısını iletir" VEYA "Her iki işlev de önceki işlevin sonucunu iletir"?
user1451111

@ user1451111, Result, lol ... Eminim bunu ilk kez yazmıştım ...

26

async.waterfall()bir ile uğraşıyor action that relies on the previous outcome.

async.series() yapmak isteyen bir eylemle uğraşmak see all the result at the end


1
Harika yaratılmış görüntüler. Onları kendiniz mi yarattınız yoksa başka bir yerde mi aldınız?
user1451111

resimleri cevaba koymalısınız, insanlar muhtemelen onları o / w özleyecektir
Alexander Mills

1

Async.waterfall'ın zararlı olduğunu düşünüyorum, çünkü bir kez yazıldıktan sonra yeniden düzenleme yapmak zordur ve ayrıca daha fazla argüman sağlarsanız, diğer işlevler imzayı çok değiştirir.

async.autoInjectAsync.waterfall'a harika bir alternatif olarak şiddetle tavsiye ederim . https://caolan.github.io/async/autoInject.js.html

Async.waterfall kullanmayı seçerseniz, her şeyi tek bir nesnede saklamanızı öneririm, böylece işlevlerinizin uzunluğu / imzaları değiştirmesine gerek kalmaz, örneğin:

uyarı: bu kötü bir model

async.waterfall([
  cb => {
    cb(null, "one", "two");
  },
  (one, two, cb) => {
    cb(null, 1, 2, 3, 4);
  },
  (one,two,three,four,cb) => {
     // ...
  }
])

bunu yukarıdaki şekilde yapma. Bu, kullanmak için çok daha iyi bir model :

async.waterfall([
  cb => {
    cb(null, {one:"one", two:"two"});
  },
  (v, cb) => {
    cb(null, [1, 2, 3, 4]);
  },
  (v,cb) => {
     // ...
  }
])

bu şekilde, işlev argümanlarının doğru uzunluğa sahip olduğundan emin olmaya çalışırken saçınızı çekmezsiniz. İlk işlev yalnızca bir argüman kabul eder - geri çağırma. Kalanların tümü iki bağımsız değişkeni kabul etmelidir - bir değer ve geri arama. Desene bağlı kal ve aklı başında kalacaksın!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.