Как уже говорилось в предыдущих ответах, 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)
В коде, показанном выше, три промиса (A, B, C) даны Promise.all
. Три обещания выполняются с разной скоростью (C — самая быстрая, а B — самая медленная). Вот почему console.log
утверждения Promises отображаются в таком порядке:
C (fast)
A (slow)
B (slower)
Если промисы являются вызовами AJAX, то удаленный сервер получит эти значения в указанном порядке. Но на стороне клиента Promise.all
обеспечивает упорядочение результатов в соответствии с исходными позициями массива myPromises
. Вот почему окончательный результат:
['A (slow)', 'B (slower)', 'C (fast)']
Если вы хотите также гарантировать фактическое выполнение ваших промисов, вам понадобится такая концепция, как очередь промисов. Вот пример использования p-queue (будьте осторожны, вам нужно обернуть все промисы в функции):
Последовательная очередь обещаний
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)']
person
Benny Neugebauer
schedule
15.02.2018