Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

137
Vistas
¿Cómo hago que el bucle javascript espere a que termine cada iteración del bucle antes de comenzar la siguiente?

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.

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

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));
about 4 years ago · Juan Pablo Isaza Denunciar

0

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:

  1. He movido el código de solicitud en una función separada httpRequest y esta función devolverá la promesa en caso de éxito
  2. Llamé a httpRequest en for loop usando la palabra clave await, ahora el loop esperará hasta que se complete la solicitud
  3. También he envuelto el código de bucle en la función, ya que solo puede usar await dentro de una función asíncrona.
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda