Supongamos que tenemos una matriz de objetos que tenemos que cargar en un servicio en la nube, el servicio hará algo con cada objeto y devolverá un resultado. La biblioteca del cliente del servicio tiene una sola función que carga el objeto y espera la respuesta. Qué código se ejecutará más rápido:
async function extractDataInstantAwait(documents) { const results = []; for (const doc of documents) { results.push(await client.extractData(doc)); } return results; } async function extractDataPromiseAll(documents) { const results = []; for (const doc of documents) { results.push(client.extractData(doc)); } return Promise.all(results); } Hasta donde yo sé, Nodejs no ejecuta código asíncrono en múltiples subprocesos, por lo que uno puede pensar que no hay diferencia entre ellos. Pero, dado que cada llamada a client.extractData puede tener que esperar una respuesta, el ciclo de eventos de Nodejs debería cambiar a la próxima promesa, hacer las cosas allí (cargar otro documento) y repetir. Tal vez, si el servicio es lento para analizar cada objeto, pero sabemos que crea nuevos subprocesos para cada operación, ¿podemos lograr algún tipo de aceleración simultánea?
¿Es correcta mi lógica?
Promise.all es más rápido, porque Promise.all permite que todas las promesas se ejecuten en paralelo, por lo que su tiempo de ejecución será el tiempo de ejecución de la promesa más larga (o cerca de ella).
Si lo hace en bucle, las promesas se ejecutan una tras otra, por lo que su tiempo de ejecución será la suma de los tiempos de ejecución de todas las promesas.
Si hay que esperar tres promesas A, B y C que toman respectivamente 200, 300 y 500 ms. Con Promise.all, se ejecutarán simultáneamente y tendrá que esperar a C durante 500 ms (A y B se habrán completado antes de eso). Con un bucle, tendrá que esperar 200 ms para A, luego esperar 300 ms para B, luego esperar 500 ms para C, por lo que esperará 1000 ms en total.