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