Como ya se ha indicado en las respuestas anteriores, Promise.all
agrega todos los valores resueltos con una matriz correspondiente al orden de entrada de las Promesas originales (consulte Agregación de promesas ).
Sin embargo, me gustaría señalar que el pedido solo se conserva en el lado del cliente.
Para el desarrollador, parece que las promesas se cumplieron en orden, pero en realidad, las promesas se procesan a diferentes velocidades. Es importante saber cuándo trabaja con un servidor remoto porque el servidor podría recibir sus promesas en un orden diferente.
Aquí hay un ejemplo que demuestra el problema mediante el uso de tiempos de espera:
Promesa.todos
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)
En el código que se muestra arriba, se dan tres promesas (A, B, C) Promise.all
. Las tres promesas se ejecutan a diferentes velocidades (C es la más rápida y B la más lenta). Es por eso que las console.log
declaraciones de las Promesas aparecen en este orden:
C (fast)
A (slow)
B (slower)
Si las Promesas son llamadas AJAX, un backend remoto recibirá estos valores en este orden. Pero del lado del cliente Promise.all
asegura que los resultados se ordenan de acuerdo con las posiciones originales de la myPromises
matriz. Por eso el resultado final es:
['A (slow)', 'B (slower)', 'C (fast)']
Si desea garantizar también la ejecución real de sus Promesas, necesitaría un concepto como una cola Promesa. Aquí hay un ejemplo usando p-queue (tenga cuidado, necesita ajustar todas las promesas en las funciones):
Cola de promesa secuencial
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)']