En la siguiente función
function test1(n, delay) { for (let i = 0; i < n; i++) { setTimeout(() => { console.log(i) }, delay) } } test1(3, 1000) Después de 1 segundo, inmediatamente console.log 1, 2 y 3 simultáneamente.
Si multiplico el delay por i ,
function test1(n, delay) { for (let i = 0; i < n; i++) { setTimeout(() => { console.log(i) }, i * delay) } } test1(3, 1000) Yo console.log cada i en mi bucle después de 1 segundo. ¿Por qué funciona esto?
Además, ¿por qué el siguiente código
function test2(n, delay) { let promise = new Promise(resolve => setTimeout(() => { resolve() }, delay)) for (let i = 0; i < n; i++) { promise.then(console.log(i)) } } test2(3, 1000) inmediatamente console.log 1, 2 y 3 simultáneamente en lugar de esperar cada segundo para console.log el siguiente valor i ? ¿Hay alguna manera de console.log el siguiente valor i usando el encadenamiento de promesas después de esperar cada segundo sin usar async y await ?
La razón por la que necesitamos multiplicar i con delay es al establecer un tiempo de timeout con un tiempo de espera de 1 s/2 s/3 s. En el ejemplo, haces que console.log() lo ejecute después de 1 segundo, 2 segundos y 3 segundos...
Si no multiplica la i con retraso, entonces todo el tiempo de espera que asigne usando for loop se ejecutará después de 1 ( delay ) segundo al mismo tiempo (casi podría ignorar el tiempo de ejecución de for loop.
Otra solución para repetir cada segundo es usar setInterval :
let i = 0; let interval; function test2(n,delay){ //Change millisecond to second delay*=1000 interval = setInterval(function(){ console.log(i); i++; if(i>n) window.clearInterval(interval) },delay) } test2(10,1)