एसिंक्रोनस प्रोसेसिंग की सामान्य कुंजी यह है कि आप अगले पुनरावृत्ति पर जाने से पहले कुछ संकेत प्राप्त करना चाहते हैं कि वर्तमान पुनरावृत्ति कब की जाती है। चूंकि वास्तविक संचालन जैसे .find()
यहां स्वयं एक "कॉलबैक" का उपयोग किया जाता है जिसे "कॉल" किया जाता है जब ऑपरेशन एक प्रतिक्रिया के साथ पूरा हो जाता है, तो आप आमतौर पर जो करना चाहते हैं वह कुछ ऐसा है जो कोड के उसी खंड में आपके पुनरावृत्ति के अंत को दर्शाता है।
मूल रूप से, आप पारंपरिक लूप में "async.eachSeries के साथ वैसा ही परिणाम प्राप्त कर सकते हैं जैसा आप कर सकते हैं " विधि, जो केवल "एक बार में एक पुनरावृत्ति" होने देगी:
function check (collection) {
var records = [ { body: "Test 1"}, { body: "Test 2" } ];
async.eachSeries(records,function(item,callback) {
collection.find( item, function (err, rows) {
console.log(rows);
callback(err)
});
},function(err) {
if (err) throw err;
console.log("done");
});
}
तो प्रत्येक सरणी तर्क को "आइटम" पैरामीटर के रूप में "इटरेटर" फ़ंक्शन में पास किया जाता है, और दूसरा तर्क बाद में उपयोग करने के लिए "कॉलबैक" फ़ंक्शन होता है। हर बार इटरेटर को कॉल करने पर, उस तर्क को .find()
. को पास कर दिया जाता है विधि जिसमें बदले में स्वयं का "कॉलबैक" होता है, जहां "त्रुटि" या "दस्तावेज़" प्रतिक्रिया दी जाती है।
उस कॉलबैक के अंदर, "इटरेटर" फ़ंक्शन द्वारा प्रदान किया गया "कॉलबैक" तब उस वर्तमान पुनरावृत्ति के पूरा होने का संकेत देने के लिए कहा जाता है। यह यहां "प्रत्येक" फ़ंक्शन को जारी रखने की अनुमति देता है और वास्तव में अगले "पुनरावृत्ति" को कॉल करता है और अगले सरणी तत्व को संसाधित करता है।
अपनी पृष्ठभूमि को ध्यान में रखते हुए, जावास्क्रिप्ट में []
के साथ "सरणी" को नोट करने के सही तरीके से अवगत रहें दिखाए गए अनुसार कोष्ठक। सरणियों के साथ काम करते समय यह आम तौर पर एक महत्वपूर्ण अंतर है।
"async.each" के और भी रूप हैं और "async.eachLimit" जो दोनों कुछ हद तक समानांतर प्रसंस्करण की अनुमति देते हैं, लेकिन "श्रृंखला" विधि चीजों को "क्रम में" इस तरह से करती है कि आप पारंपरिक लूप के साथ उपयोग किए जाते हैं।
तो जहां लूप संचालन "गैर-अवरुद्ध" हैं, आपको आगे बढ़ने से पहले यह संकेत देना होगा कि वह लूप कब पूरा होता है।