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);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);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);