tengo algunas funciones
const firstResult = await firstFunction(parameters) const secondResult = await secondFunction(firstResult) const finalResult = await finalFunction(secondResult)Son funciones asíncronas, que devuelven alguna promesa. Ahora hay un escenario en el que tengo una serie de parámetros que se pasan a `firstFunction en cada iteración y debería seguir el mismo flujo de ejecución. Algo como esto:
const results = arrayOfParamters.map(async parameter => { const firstResult = await firstFunction(parameters) const secondResult = await secondFunction(firstResult) const finalResult = await finalFunction(secondResult) return finalResult }) Entonces, ¿cómo puedo lograr esto de manera más eficiente? Una de las soluciones eficientes que puedo visualizar es ejecutar firstFunction para el primer parameter , comenzar a ejecutar secondFunction y hasta entonces se cumple la promesa de secondFunction , comenzar a ejecutar firstFunction para la próxima iteración de arrayOfParameters . ¿Hay alguna manera de que pueda lograr esto? Parece que Promise.all no valdrá la pena si todo el bucle se va a ejecutar de forma sincrónica.
Su código ya está configurado para hacer eso.
Comenzará ejecutando el código del mapa para el elemento 0 de la matriz. Llama sincrónicamente a firstFunction pero luego presiona await , por lo que la función de mapeo devuelve una promesa. Esta promesa se pone en el elemento 0 de results . Luego hace lo mismo para el elemento 1, luego para el 2, etc. Por lo tanto, llamará a firstFunction para cada elemento de la matriz y asignará una matriz de promesas a los results , pero ninguna de ellas se bloqueará ni esperará.
La matriz de promesas ahora se ha creado, por lo que el código continúa con lo que viene después de esta línea. Con el tiempo, las llamadas a firstFunction comenzarán a finalizar y las funciones async se reanudarán, llamando a secondFunction para cada elemento de la matriz (no necesariamente en exactamente el mismo orden, ya que esto sucede en un momento impredecible). Y luego, eventualmente, todos realizarán la tercera función y, finalmente, resolverán sus promesas en finalResult .
Entonces, lo único que falta en su código es saber cuándo está todo listo, y para eso necesita Promise.all :
const promises = arrayOfParamters.map(async parameter => { const firstResult = await firstFunction(parameter) const secondResult = await secondFunction(firstResult) const finalResult = await finalFunction(secondResult) return finalResult }) const results = await Promise.all(promises)Debido a que Promise.then encadena el resultado como un parámetro a la siguiente función, puede usar eso en lugar de async await
Puedes usar Promise.all así:
const promiseChain = arrayOfParamters.map((parameter) => firstFunction(parameter).then(secondFunction).then(finalFunction)); const results = await Promise.all(promiseChain);