जैसा कि पिछले उत्तर पहले ही बता चुके हैं, Promise.all
मूल वादों के इनपुट क्रम के अनुरूप एक सरणी के साथ सभी हल किए गए मानों को एकत्र करता है (देखें एग्रीगेटिंग प्रॉमिस देखें )।
हालाँकि, मैं यह बताना चाहूंगा कि ऑर्डर केवल क्लाइंट की तरफ संरक्षित है!
डेवलपर को ऐसा लगता है कि वादे क्रम में पूरे हुए थे लेकिन वास्तव में, वादे अलग गति से संसाधित किए जाते हैं। यह जानना महत्वपूर्ण है कि जब आप एक दूरस्थ बैकएंड के साथ काम करते हैं क्योंकि बैकएंड को एक अलग क्रम में आपके वादे प्राप्त हो सकते हैं।
यहाँ एक उदाहरण है जो टाइमआउट का उपयोग करके समस्या को प्रदर्शित करता है:
Promise.all
const myPromises = [
new Promise((resolve) => setTimeout(() => {resolve('A (slow)'); console.log('A (slow)')}, 1000)),
new Promise((resolve) => setTimeout(() => {resolve('B (slower)'); console.log('B (slower)')}, 2000)),
new Promise((resolve) => setTimeout(() => {resolve('C (fast)'); console.log('C (fast)')}, 10))
];
Promise.all(myPromises).then(console.log)
ऊपर दिखाए गए कोड में, तीन वादे (ए, बी, सी) दिए गए हैं Promise.all
। तीन वादे अलग-अलग गति से निष्पादित होते हैं (C सबसे तेज़ और B सबसे धीमा है)। इसीलिए console.log
इस क्रम में वादों के विवरण दिखाए गए हैं:
C (fast)
A (slow)
B (slower)
यदि वादे AJAX कॉल हैं, तो एक दूरस्थ बैकएंड इस क्रम में इन मूल्यों को प्राप्त करेगा। लेकिन क्लाइंट पक्ष Promise.all
यह सुनिश्चित करता है कि परिणाम myPromises
सरणी के मूल पदों के अनुसार क्रमबद्ध हों । इसलिए अंतिम परिणाम है:
['A (slow)', 'B (slower)', 'C (fast)']
यदि आप अपने वादों के वास्तविक निष्पादन की भी गारंटी देना चाहते हैं, तो आपको एक वादा कतार की तरह एक अवधारणा की आवश्यकता होगी। पी-कतार का उपयोग करके एक उदाहरण दिया गया है (सावधान रहें, आपको सभी कार्यों को पूरा करने की आवश्यकता है):
अनुक्रमिक वादा कतार
const PQueue = require('p-queue');
const queue = new PQueue({concurrency: 1});
// Thunked Promises:
const myPromises = [
() => new Promise((resolve) => setTimeout(() => {
resolve('A (slow)');
console.log('A (slow)');
}, 1000)),
() => new Promise((resolve) => setTimeout(() => {
resolve('B (slower)');
console.log('B (slower)');
}, 2000)),
() => new Promise((resolve) => setTimeout(() => {
resolve('C (fast)');
console.log('C (fast)');
}, 10))
];
queue.addAll(myPromises).then(console.log);
परिणाम
A (slow)
B (slower)
C (fast)
['A (slow)', 'B (slower)', 'C (fast)']