Array.forEach
यह नॉट्टी प्रदान नहीं करता है (यदि ऐसा है तो ओह) लेकिन आप जो चाहते हैं उसे पूरा करने के कई तरीके हैं:
एक साधारण काउंटर का उपयोग करना
function callback () { console.log('all done'); }
var itemsProcessed = 0;
[1, 2, 3].forEach((item, index, array) => {
asyncFunction(item, () => {
itemsProcessed++;
if(itemsProcessed === array.length) {
callback();
}
});
});
(@vanuan और अन्य के लिए धन्यवाद) यह दृष्टिकोण गारंटी देता है कि सभी आइटम "किए गए" कॉलबैक को लागू करने से पहले संसाधित होते हैं। आपको कॉलबैक में अपडेट होने वाले काउंटर का उपयोग करने की आवश्यकता है। सूचकांक पैरामीटर के मूल्य के आधार पर एक ही गारंटी प्रदान नहीं करता है, क्योंकि अतुल्यकालिक संचालन की वापसी के आदेश की गारंटी नहीं है।
ईएस 6 प्रॉमिस का उपयोग करना
(एक वादा पुस्तकालय पुराने ब्राउज़रों के लिए इस्तेमाल किया जा सकता है):
तुल्यकालिक निष्पादन की गारंटी देने वाले सभी अनुरोधों को संसाधित करें (जैसे 1 तब 2 फिर 3)
function asyncFunction (item, cb) {
setTimeout(() => {
console.log('done with', item);
cb();
}, 100);
}
let requests = [1, 2, 3].reduce((promiseChain, item) => {
return promiseChain.then(() => new Promise((resolve) => {
asyncFunction(item, resolve);
}));
}, Promise.resolve());
requests.then(() => console.log('done'))
"तुल्यकालिक" निष्पादन के बिना सभी async अनुरोधों को संसाधित करें (2 1 से अधिक तेजी से समाप्त हो सकता है)
let requests = [1,2,3].map((item) => {
return new Promise((resolve) => {
asyncFunction(item, resolve);
});
})
Promise.all(requests).then(() => console.log('done'));
एक Async लाइब्रेरी का उपयोग करना
अन्य अतुल्यकालिक पुस्तकालय हैं, async सबसे लोकप्रिय है, जो आप चाहते हैं व्यक्त करने के लिए तंत्र प्रदान करते हैं।
संपादित करें
प्रश्न का मुख्य भाग पहले सिंक्रोनस उदाहरण कोड को हटाने के लिए संपादित किया गया है, इसलिए मैंने स्पष्टीकरण देने के लिए अपना उत्तर अपडेट कर दिया है। मूल एसिंक्रोनस व्यवहार को कोड करने के लिए कोड जैसे मूल उदाहरण का उपयोग किया जाता है, इसलिए निम्नलिखित लागू होता है:
array.forEach
है तुल्यकालिक और इतने है res.write
, तो आप बस foreach के लिए अपने कॉल के बाद अपने कॉलबैक रख सकते हैं:
posts.foreach(function(v, i) {
res.write(v + ". index " + i);
});
res.end();
forEach
विधि मेंdone
कॉलबैक पैरामीटर औरallDone
कॉलबैक था!