Soy nuevo en JavaScript y estaba aprendiendo sobre promesas. Quiero imprimir de 5 a 0 números en un intervalo de 2 segundos cada uno. Por ejemplo, por primera vez después de 2 segundos imprime 5 y luego después de 2 segundos imprime 4 y así sucesivamente. He escrito un código para hacerlo, pero no puedo obtener el resultado correcto.
var count = 5; var i = 2; function d() { let p = new Promise((resolve,reject)=>{ while(count>=0) { setTimeout(resolve,i*1000,count); i= i*2; count = count-1; //count = count-1; } }); return p; } d().then((x)=>{ console.log(x); });Muestra la salida como 5. ¿Alguien puede corregirlo?
Es mucho más fácil escribir esto usando la sintaxis async ... await ... luego puede crear una función de pause que retrasará el tiempo de espera en milisegundos. Podemos envolver esto en una instrucción while , haciendo un bucle hasta que el conteo sea cero.
async function pause(timeout) { return new Promise(resolve => setTimeout(resolve, timeout)) } async function countDown(count) { while (count > 0) { await pause(2000); console.log('count:', count); count--; } } countDown(5);Siempre que esté escribiendo un programa, es una buena idea cuantificar qué es lo que necesita para realizar un seguimiento.
En este caso tenemos tres componentes.
Un for..loop básico nos permite recorrer el rango de números y poner en cola algunas llamadas setTimeout con nuestra devolución de llamada:
/** * CountDown * * @param {Function} callback - The callback is a function that we call each "tick" * @param {number} countDownFrom - The countdown starts at this number * @param {number} interval - the number of milliseconds between each "tick" */ function CountDown( callback, countDownFrom, interval ) { for (var count = 0; count <= countDownFrom; count++) { setTimeout(callback, (countDownFrom - count) * interval, count); } } CountDown( (x) => { console.log(x); }, 5, 2 * 1000 );He puesto algunos enlaces a www.w3schools.com en esta respuesta. Allí puede encontrar documentación y tutoriales para muchos problemas de JavaScript.