Quiero contrarrestar algún número usando la promesa de que el resultado es 1,2,3, hecho y lo he codificado así
const state = true const count = new Promise((resolve, reject) => { if (state) { resolve("counter work") for (let i = 1; i <= 3; i++) { setTimeout(() => { console.log(i); }, 1000); } console.log("done"); } else { reject("counter not work") } }) count .then((response) => console.log("success", response)) .catch((response) => console.log("failed", response));y el resultado es: hecho, 1,2,3 pero quiero el resultado 1,2,3, hecho
¿Alguien puede decir por qué mi código tiene un resultado así y cómo debería ser el código?
Dejando a un lado la resolución temprana, la razón por la que "hecho" se registra primero es que está llamando a setTimeout en un bucle. setTimeout no bloquea la ejecución, pone en cola una devolución de llamada para que se ejecute después de un tiempo y regresa de inmediato. Entonces, solo está creando tres tiempos de espera que se activarán aproximadamente un segundo después de que haya salido del ciclo y registrado "hecho".
Para crear un temporizador, puede llamar condicionalmente a setTimeout dentro de la devolución de llamada:
new Promise((resolve, reject) => { let i = 0 function increment () { i++ console.log(i) if (i < 3) { setTimeout(increment, 1000) } else { console.log('done') resolve() // to mark the promise as completed } } setTimeout(increment, 1000) })