Önceki yanıtların daha önce belirttiği gibi, Promise.all
tüm çözümlenmiş değerleri, orijinal Vaatlerin giriş sırasına karşılık gelen bir dizi ile toplar (bkz . Vaatleri Birleştirme ).
Ancak, siparişin yalnızca müşteri tarafında korunduğunu belirtmek isterim!
Geliştirici için, Sözler sırayla yerine getirilmiş gibi görünüyor, ancak gerçekte, Sözler farklı hızlarda işleniyor. Uzak bir arka uçla çalıştığınızda bunu bilmek önemlidir, çünkü arka uç sözlerinizi farklı bir sırayla alabilir.
Zaman aşımlarını kullanarak sorunu gösteren bir örnek:
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)
Yukarıda gösterilen kodda üç Vaat (A, B, C) verilmiştir Promise.all
. Üç Vaat farklı hızlarda gerçekleşir (C en hızlı ve B en yavaştır). Bu yüzden console.log
Vaatlerin ifadeleri şu sırayla ortaya çıkıyor:
C (fast)
A (slow)
B (slower)
Sözler AJAX çağrılarıysa, uzak bir arka uç bu değerleri bu sırayla alır. Ancak istemci tarafında Promise.all
, sonuçların myPromises
dizinin orijinal konumlarına göre sıralanmasını sağlar . Bu yüzden nihai sonuç:
['A (slow)', 'B (slower)', 'C (fast)']
Sözlerinizin gerçek olarak yürütülmesini de garanti etmek istiyorsanız, bir Söz kuyruğu gibi bir konsepte ihtiyacınız olacaktır. İşte p-queue kullanan bir örnek (dikkatli olun, tüm vaatleri fonksiyonlara sarmanız gerekir):
Sıralı Promise Kuyruğu
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);
Sonuç
A (slow)
B (slower)
C (fast)
['A (slow)', 'B (slower)', 'C (fast)']