द नोडज एसिंक्स मॉड्यूल: https://github.com/caolan/async 2 समान तरीके प्रदान करता है, async.waterfallऔर async.series।
उनके बीच क्या अंतर है?
द नोडज एसिंक्स मॉड्यूल: https://github.com/caolan/async 2 समान तरीके प्रदान करता है, async.waterfallऔर async.series।
उनके बीच क्या अंतर है?
जवाबों:
ऐसा प्रतीत होता है कि async.waterfallप्रत्येक फ़ंक्शन अपने परिणामों को अगले फ़ंक्शन पर पारित करने की अनुमति देता है, जबकि async.seriesअंतिम कॉलबैक के लिए सभी परिणाम पास करता है। एक उच्च स्तर पर, async.waterfallएक डेटा पाइपलाइन के लिए होगा ("2 दिया गया, इसे 3 से गुणा करें, 2 जोड़ें, और 17 से विभाजित करें"), जबकि async.seriesअसतत कार्यों के लिए होगा जो क्रम में किया जाना चाहिए, लेकिन अन्यथा अलग हैं।
waterfallहै और न ही seriesएक मान देता है। यह उम्मीद की जाती है कि वैकल्पिक कॉलबैक पैरामीटर में जो भी परिणाम का उपयोग किया जाएगा।
दोनों फ़ंक्शन अगले फ़ंक्शन के लिए, प्रत्येक फ़ंक्शन के रिटर्न मान को पास करते हैं, फिर जब किया जाता है तो मुख्य कॉलबैक होगा, यदि कोई त्रुटि होती है, तो इसकी त्रुटि को पार करना।
अंतर यह है कि async.series(), एक बार श्रृंखला समाप्त हो जाने के बाद, सभी परिणाम मुख्य कॉलबैक में पारित करेंगे। async.waterfall()केवल अंतिम कॉल के परिणाम में मुख्य कॉलबैक को पास करेगा।
async.waterfall()एक के साथ काम कर रहा है action that relies on the previous outcome।
async.series() एक कार्रवाई के साथ काम करना चाहता है see all the result at the end
मैं 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 - कॉलबैक स्वीकार करता है। शेष सभी को दो तर्क स्वीकार करना चाहिए - एक मूल्य और कॉलबैक। पैटर्न के लिए छड़ी और आप समझदार रहेंगे!