Async.waterfall और async.series के बीच अंतर क्या है


जवाबों:


168

ऐसा प्रतीत होता है कि async.waterfallप्रत्येक फ़ंक्शन अपने परिणामों को अगले फ़ंक्शन पर पारित करने की अनुमति देता है, जबकि async.seriesअंतिम कॉलबैक के लिए सभी परिणाम पास करता है। एक उच्च स्तर पर, async.waterfallएक डेटा पाइपलाइन के लिए होगा ("2 दिया गया, इसे 3 से गुणा करें, 2 जोड़ें, और 17 से विभाजित करें"), जबकि async.seriesअसतत कार्यों के लिए होगा जो क्रम में किया जाना चाहिए, लेकिन अन्यथा अलग हैं।


क्या इन दोनों कार्यों के लिए किसी मूल्य को वापस करना संभव है? मैंने पढ़ा है कि यह संभव है, लेकिन मैं प्रलेखन में कहीं भी प्रासंगिक जानकारी नहीं पा सकता हूं।
एंडरसन ग्रीन

1
@AndersonGreen: नहींं। पुस्तकालय स्रोत को देखते हुए, न waterfallहै और न ही seriesएक मान देता है। यह उम्मीद की जाती है कि वैकल्पिक कॉलबैक पैरामीटर में जो भी परिणाम का उपयोग किया जाएगा।
ट्विसोल

उपरोक्त उत्तर 2012 तक वापस सही हो सकता है, लेकिन सही एक अगले के समान है, जो है: श्रृंखला () यह नाम दिया गया है कि सभी परिणाम एक श्रृंखला के रूप में अंतिम कॉलबैक में पारित हो गए हैं, और झरना का अंतिम परिणाम है अंतिम कॉलबैक। मोज़िला डेवलपर
Jeb50

53

दोनों फ़ंक्शन अगले फ़ंक्शन के लिए, प्रत्येक फ़ंक्शन के रिटर्न मान को पास करते हैं, फिर जब किया जाता है तो मुख्य कॉलबैक होगा, यदि कोई त्रुटि होती है, तो इसकी त्रुटि को पार करना।

अंतर यह है कि async.series(), एक बार श्रृंखला समाप्त हो जाने के बाद, सभी परिणाम मुख्य कॉलबैक में पारित करेंगे। async.waterfall()केवल अंतिम कॉल के परिणाम में मुख्य कॉलबैक को पास करेगा।


1
इसका उत्तर होना चाहिए; ;-)
स्टुअर्ट एलन

@Mario "दोनों फ़ंक्शन पिछले फ़ंक्शन के कॉलबैक को पास करते हैं" या "दोनों फ़ंक्शन पिछले फ़ंक्शन के परिणाम को पास करते हैं"?
user1451111

@ user1451111, परिणाम, lol ... मुझे यकीन है कि मैंने लिखा था कि हालांकि पहली बार ...

26

async.waterfall()एक के साथ काम कर रहा है action that relies on the previous outcome

async.series() एक कार्रवाई के साथ काम करना चाहता है see all the result at the end


1
अजीब तरह से बनाई गई छवियां। क्या आपने उन्हें खुद बनाया या उन्हें कहीं और मिला?
user1451111

आपको जवाब में तस्वीरें डालनी चाहिए, लोग शायद उन्हें ओ / डब्ल्यू
अलेक्जेंडर मिल्स

1

मैं async.waterfall को हानिकारक मानता हूं, क्योंकि एक बार लिखे जाने के बाद रिफलेक्टर करना मुश्किल होता है और साथ ही त्रुटि-प्रवण होता है क्योंकि यदि आप अधिक तर्कों की आपूर्ति करते हैं, तो अन्य फ़ंक्शन हस्ताक्षर को बहुत बदल देते हैं।

मैं async.autoInjectasync.waterfall को एक महान विकल्प के रूप में अत्यधिक सलाह देता हूं। https://caolan.github.io/async/autoInject.js.html

यदि आप async.waterfall का उपयोग करने का चयन करते हैं, तो मैं एक वस्तु में सब कुछ संग्रहीत करने की सलाह देता हूं, इसलिए आपके कार्यों को लंबाई / हस्ताक्षर बदलने की आवश्यकता नहीं है, जैसे:

चेतावनी: यह एक बुरा पैटर्न है

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

उपरोक्त तरीके से मत करो। यह उपयोग करने के लिए एक बेहतर पैटर्न है:

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

इस तरह से आप यह सुनिश्चित करने के लिए अपने बालों को खींच नहीं पाएंगे कि फ़ंक्शन के तर्क सही लंबाई के हैं। पहला फ़ंक्शन केवल एक arg - कॉलबैक स्वीकार करता है। शेष सभी को दो तर्क स्वीकार करना चाहिए - एक मूल्य और कॉलबैक। पैटर्न के लिए छड़ी और आप समझदार रहेंगे!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.