Tengo un ciclo que se itera 1000 veces donde cada iteración hace una solicitud y luego imprime el resultado de esa solicitud.
Similar al de abajo.
let start = console.log(Date.now()) for (i = 0; i < 1000; i++) { request.then(data => { console.log(Date.now() - start) }) }Sin embargo, esto da como resultado que la primera solicitud tarde mucho más en completarse que si hubiera solo 1 iteración del ciclo.
con i < 1000:
5860 ...con yo < 1:
220, ...Sin embargo, para el objetivo de este script, quiero esperar a que se reciba cada resultado antes de comenzar la siguiente iteración del ciclo.
Si desea seguir con la forma ES5 de manejar Promises, puede usar el siguiente enfoque:
const start = console.log(Date.now()) // Create a instantly resolved promise for (let i = 0, p = Promise.resolve(); i < 1000; i++) { // append new promise to the chain p = p.then(() => request() .then(() => console.log(Date.now() - start)); } Si puede usar métodos ES6, puede escribir esto usando el patrón async/await así:
const asyncLoop = async () => { const start = console.log(Date.now()) for (let i = 0; i < 1000; i++) { const data = await request(); console.log(Date.now() - start); } } asyncLoop(); Sin embargo, la posibilidad de que realmente desee realizar las solicitudes una tras otra es bastante pequeña, por lo que en caso de que desee realizar la solicitud simultáneamente, pero haga algo después de que se hayan resuelto todas, puede usar Promise.all(...)
const start = console.log(Date.now()) const requests = [request1, request2, ...]; Promise.all(requests) .then(() => console.log(Date.now() - start));Puede usar el patrón async-await aquí. Puedes lograr esto cambiando el código.
async function iteration() { let start = console.log(Date.now()) for (let i = 0; i < 1000; i++) { const data = await httpRequest() console.log(Date.now() - start) } } async function httpRequest() { return new Promise((resolve, reject) => { request.then(data => { //Do anything you want to do with data resolve(data) }).catch(error => { console.error(`Error in request`) reject(error) }) }) }Explicación: