Al mirar MDN , parece que se values
pasó a la then()
devolución de llamada de Promise.all contiene los valores en el orden de las promesas. Por ejemplo:
var somePromises = [1, 2, 3, 4, 5].map(Promise.resolve);
return Promise.all(somePromises).then(function(results) {
console.log(results) // is [1, 2, 3, 4, 5] the guaranteed result?
});
¿Alguien puede citar una especificación que indique en qué orden values
debe estar?
PD: Ejecutar un código como ese demostró que esto parece ser cierto, aunque eso no es una prueba, podría haber sido una coincidencia.
fuente
throw
una excepción si le pasas un iterable aPromise.all
. Además, no estoy al tanto de ninguna implementación de promesa de tierra de usuario que actualmente sea compatible con iteraciones pasables, aunque muchos lo han debatido y decidido no hacerlo en ese momento.Promise.all
no se puede utilizar para ejecutar una serie de promesas en orden, una tras otra. Las promesas cargadas en el iterador deben ser independientes entre sí para que esto funcione de manera predecible.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
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 lasconsole.log
declaraciones de las Promesas aparecen en este orden: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 lamyPromises
matriz. Por eso el resultado final es: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
Resultado
fuente
Sí, los valores en
results
están en el mismo orden quepromises
.Uno podría citar la especificación ES6
Promise.all
, aunque es un poco complicado debido a la API de iterador utilizada y al constructor de promesa genérico. Sin embargo, notará que cada devolución de llamada de resolución tiene un[[index]]
atributo que se crea en la iteración de matriz de promesa y se utiliza para establecer los valores en la matriz de resultados.fuente