Como as respostas anteriores já declararam, Promise.all
agrega todos os valores resolvidos com uma matriz correspondente à ordem de entrada das promessas originais (consulte Agregando promessas ).
No entanto, gostaria de salientar que o pedido é preservado apenas no lado do cliente!
Para o desenvolvedor, parece que as promessas foram cumpridas em ordem, mas, na realidade, as promessas são processadas em velocidades diferentes. É importante saber quando você trabalha com um back-end remoto, pois o back-end pode receber suas promessas em uma ordem diferente.
Aqui está um exemplo que demonstra o problema usando tempos limite:
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)
No código mostrado acima, três promessas (A, B, C) são dadas Promise.all
. As três promessas são executadas em velocidades diferentes (C sendo a mais rápida e B sendo a mais lenta). É por isso que as console.log
declarações das promessas aparecem nesta ordem:
C (fast)
A (slow)
B (slower)
Se as Promessas forem chamadas AJAX, um back-end remoto receberá esses valores nesta ordem. Mas no lado do cliente Promise.all
garante que os resultados sejam ordenados de acordo com as posições originais da myPromises
matriz. É por isso que o resultado final é:
['A (slow)', 'B (slower)', 'C (fast)']
Se você deseja garantir também a execução real de suas promessas, precisará de um conceito como uma fila de promessas. Aqui está um exemplo usando a fila p (tenha cuidado, você precisa agrupar todas as promessas em funções):
Fila de Promessa Sequencial
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);
Resultado
A (slow)
B (slower)
C (fast)
['A (slow)', 'B (slower)', 'C (fast)']