Quería imprimir console.log en sincronización - * cada segundo imprimir consola en sincronización uno por uno
La salida debe ser
start a 3 second timer 3 second remaining 2 second remaining 1 second remaining after 3 second timer, start a 5 second timer 5 second remaining 4 second remaining 3 second remaining 2 second remaining 1 second remaining both timers done! Timer done! function main() { console.log('start a 3 second timer'); printTimer(3, () => { console.log('after 3 second timer, start a 5 second timer'); printTimer(5, () => { console.log("both timers done!"); }); }); } main(); function printTimer(n, callback) { for (let i = 0; i < n; i++) { setTimeout(()=> console.log(`${n - i} seconds remaining`)); } } setTimeout(() => console.log('timer done!')) callback() }Soy nuevo en JS y quería saber cómo podemos obtener tales console.logs. Gracias de antemano.
Solución:
function main() { console.log('start a 3 second timer'); printTimer(3, () => { console.log('after 3 second timer, start a 5 second timer'); printTimer(5, () => { console.log("both timers done!"); console.log("Timer done!") }); }); } main(); async function printTimer(n, callback) { const waitForMilliseconds = ms => new Promise(resolve => setTimeout(resolve, ms)) for (let i = 0; i < n; i++) { console.log(`${n - i} seconds remaining`) await waitForMilliseconds(1000) } callback() }En lugar de anidar sus funciones e iterar sobre setTimeout , cree una función que devuelva una promesa , y dentro de esa promesa use un setTimeout para registrar los números en la consola. Si usa async/await , puede esperar a que se resuelva cada promesa.
function timer(n) { return new Promise((res, rej) => { // `loop` accepts an argument `i` which is the // initial value of n, but which gets reduced on // each iteration function loop(i) { // If `i` reaches zero pass back the resolve value if (i === 0) { res('Done'); // Otherwise log the current value of `i` // and call the loop function again reducing // the value of `i` } else { console.log(`${i} seconds remaining.`); setTimeout(loop, 1000, --i); } } // Pass in the number, and start the loop loop(n); }); } // Now just `await` the response from the promises (async () => { console.log('Start a 3 second timer'); console.log(await timer(3)); console.log('After 3 second timer, start a 5 second timer'); console.log(await timer(5)); console.log('Both timers done.'); })();