Jak już wspomniano w poprzednich odpowiedziach, Promise.all
agreguje wszystkie rozstrzygnięte wartości za pomocą tablicy odpowiadającej kolejności wprowadzania oryginalnych obietnic (patrz Agregowanie obietnic ).
Chciałbym jednak zaznaczyć, że zamówienie jest zachowywane tylko po stronie klienta!
Dla programisty wygląda na to, że obietnice zostały spełnione w kolejności, ale w rzeczywistości obietnice są przetwarzane z różnymi prędkościami. Jest to ważne, aby wiedzieć, kiedy pracujesz ze zdalnym backendem, ponieważ backend może otrzymywać Twoje obietnice w innej kolejności.
Oto przykład, który pokazuje problem przy użyciu limitów czasu:
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)
W powyższym kodzie podane są trzy obietnice (A, B, C) Promise.all
. Trzy obietnice wykonują się przy różnych prędkościach (C jest najszybszy, a B jest najwolniejszy). Dlatego console.log
oświadczenia Obietnic pojawiają się w następującej kolejności:
C (fast)
A (slow)
B (slower)
Jeśli obietnice są wywołaniami AJAX, zdalny backend otrzyma te wartości w tej kolejności. Ale po stronie klienta Promise.all
zapewnia, że wyniki są uporządkowane zgodnie z pierwotnymi pozycjami myPromises
tablicy. Właśnie dlatego końcowy wynik to:
['A (slow)', 'B (slower)', 'C (fast)']
Jeśli chcesz zagwarantować również faktyczne wykonanie Twoich obietnic, potrzebujesz koncepcji takiej jak kolejka Obietnic. Oto przykład użycia kolejki p (uważaj, musisz zawinąć wszystkie obietnice w funkcje):
Sekwencyjna kolejka obietnic
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);
Wynik
A (slow)
B (slower)
C (fast)
['A (slow)', 'B (slower)', 'C (fast)']