टी एल; डॉ
Promise.all
समानांतर फ़ंक्शन कॉल के लिए उपयोग करें , त्रुटि होने पर उत्तर व्यवहार सही ढंग से नहीं।
सबसे पहले, सभी अतुल्यकालिक कॉल को एक साथ निष्पादित करें और सभी Promise
ऑब्जेक्ट प्राप्त करें। दूसरा, वस्तुओं await
पर उपयोग करें Promise
। इस तरह, जबकि आप Promise
दूसरे अतुल्यकालिक कॉल को हल करने के लिए पहले इंतजार करते हैं, अभी भी प्रगति कर रहे हैं। कुल मिलाकर, आप केवल सबसे धीमी एसिंक्रोनस कॉल के रूप में लंबे समय तक इंतजार करेंगे। उदाहरण के लिए:
// Begin first call and store promise without waiting
const someResult = someCall();
// Begin second call and store promise without waiting
const anotherResult = anotherCall();
// Now we await for both results, whose async processes have already been started
const finalResult = [await someResult, await anotherResult];
// At this point all calls have been resolved
// Now when accessing someResult| anotherResult,
// you will have a value instead of a promise
JSbin उदाहरण: http://jsbin.com/xerifanima/edit?js,console
कैविएट:await
कॉल एक ही लाइन पर या अलग-अलग लाइनों पर होने से कोई फर्क नहीं पड़ता , इसलिए जब तक पहली await
कॉल सभी अतुल्यकालिक कॉल के बाद होती है । देखें जॉनीएचके की टिप्पणी
अपडेट: इस उत्तर में @ बर्गी के उत्तर के अनुसार त्रुटि से निपटने में एक अलग समय है , यह त्रुटि को बाहर नहीं फेंकता है क्योंकि त्रुटि तब होती है लेकिन सभी वादों के निष्पादन के बाद। मैं @ जॉनी की टिप के साथ परिणाम की तुलना करता हूं:, [result1, result2] = Promise.all([async1(), async2()])
निम्नलिखित कोड स्निपेट की जांच करें
const correctAsync500ms = () => {
return new Promise(resolve => {
setTimeout(resolve, 500, 'correct500msResult');
});
};
const correctAsync100ms = () => {
return new Promise(resolve => {
setTimeout(resolve, 100, 'correct100msResult');
});
};
const rejectAsync100ms = () => {
return new Promise((resolve, reject) => {
setTimeout(reject, 100, 'reject100msError');
});
};
const asyncInArray = async (fun1, fun2) => {
const label = 'test async functions in array';
try {
console.time(label);
const p1 = fun1();
const p2 = fun2();
const result = [await p1, await p2];
console.timeEnd(label);
} catch (e) {
console.error('error is', e);
console.timeEnd(label);
}
};
const asyncInPromiseAll = async (fun1, fun2) => {
const label = 'test async functions with Promise.all';
try {
console.time(label);
let [value1, value2] = await Promise.all([fun1(), fun2()]);
console.timeEnd(label);
} catch (e) {
console.error('error is', e);
console.timeEnd(label);
}
};
(async () => {
console.group('async functions without error');
console.log('async functions without error: start')
await asyncInArray(correctAsync500ms, correctAsync100ms);
await asyncInPromiseAll(correctAsync500ms, correctAsync100ms);
console.groupEnd();
console.group('async functions with error');
console.log('async functions with error: start')
await asyncInArray(correctAsync500ms, rejectAsync100ms);
await asyncInPromiseAll(correctAsync500ms, rejectAsync100ms);
console.groupEnd();
})();