Estoy ejecutando una función recursiva con setTimeout, lo que noté es que javascript pasa directamente a través de la función wait() y no espera a que termine. Continúa y deja que el método wait() funcione solo.
wait(100, 30) function wait(time, limit) { console.log('value >> ' + limit) if (limit < 0) return 'success' setTimeout(function () { wait(time, --limit) }, time) } console.log('hi')Tenga en cuenta que mi mensaje "hola" está en la parte superior cuando se ejecuta el script, ya que pasó directamente sin esperar el bucle recursivo. Mi mensaje "hola" debe estar al final.
¿Alguien puede ayudarme a dejar el mensaje hola al final después de ejecutar todo el ciclo?
Podría entregar una función que se llama al final de la espera.
function wait(time, limit, fn) { console.log('value >> ' + limit) if (limit < 0) return fn(); setTimeout(function () { wait(time, --limit, fn); }, time) } function sayHi() { console.log('hi'); } wait(100, 30, sayHi);también puede simplemente devolver el mensaje que desea:
wait(100, 30); function wait(time, limit) { console.log("value >> " + limit); if (limit < 0) return console.log("hi"); setTimeout(function () { wait(time, --limit); }, time); }Además del enfoque de Nina y también para los casos de uso en los que no se puede implementar una devolución de llamada tan fácilmente como se demostró con el código de ejemplo de Nina , se podría usar una abstracción para ello, que para JavaScript es Promise s.
Aquí, en lugar de 30 veces de retraso de 100 milisegundos hasta el registro, uno implementaría wait como promesa que se resuelve después de 3 segundos con el registro adicional proporcionado como entonces posible ...
const wait = new Promise(resolve => setTimeout(resolve, 3000)); wait.then(() => console.log('hi')); console.log({ wait: String(wait) }); .as-console-wrapper { min-height: 100%!important; top: 0; }