Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

475
Views
¿Cómo espero a que termine una promesa dentro de un bucle? (sin usar async-await)

El siguiente código espera solo la primera iteración del bucle for. Si uso async-await, funciona bien. Entonces, ¿dónde me estoy equivocando aquí?

 function wait(milliseconds) { return new Promise(resolve => setTimeout(resolve, milliseconds)) } function countDown(count) { for (let i = count; i > 0; i--) { wait(1000) .then(() => console.log(i)) .catch((error) => console.log(error)); } } countDown(5);
about 4 years ago · Santiago Gelvez
2 answers
Answer question

0

Porque Promise ejecutará la instrucción "entonces" cuando haya realizado su tarea. Y si usa el ciclo así, la Promesa para i=4 se ejecutará inmediatamente después de ejecutar i=5. Esto hará que la salida solo espere por la primera.

La solución para esto es ejecutar la Promesa (i=4) después de la Promesa (i=5) usando la función recursiva.

 function wait(milliseconds) { return new Promise(resolve => setTimeout(resolve, milliseconds)) } function countDown(count) { if (count === 0) return; wait(1000) .then(() => { console.log(count) countDown(count - 1) }) .catch((error) => console.log(error)); } countDown(5);
about 4 years ago · Santiago Gelvez Report

0

La ejecución no se detiene then llamas a una Promise como lo hace cuando usas await . En el primer bucle se crea una Promise cuyo método then se ejecutará en un segundo, pero la función continúa en bucle porque la ejecución no se ha detenido. Al final del ciclo, tiene cinco objetos Promise que se han creado consecutivamente sin pausas entre ellos, por lo que sus tiempos de espera de un segundo se ejecutan muy cerca uno del otro.

Aquí está el método de await con un comentario que indica dónde se detiene la ejecución.

 function wait(milliseconds) { return new Promise(resolve => setTimeout(resolve, milliseconds)); } async function countDown(count) { for (let i = count; i > 0; i--) { await wait(1000); // Execution stops here for one second before continuing console.log(i); } } countDown(5);

Aquí hay algo más cercano a la respuesta de Phúc Đỗ Vương con un comentario que indica dónde la ejecución no se detiene.

 function wait(milliseconds) { return new Promise(resolve => setTimeout(resolve, milliseconds)); } function countDown(count) { if (count === 0) { return; } wait(1000).then(() => { // This code, including the next call to countDown, will execute in one second console.log(count); countDown(count - 1); }); // The current call to countDown finishes before the next call begins } countDown(5);
about 4 years ago · Santiago Gelvez Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!