es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Async/Await con setTimeout funciona bien pero no con un retraso personalizado.

Cuando ejecuto un ejemplo que encontré en internet que utiliza setTimeout, funciona bien. Pero cuando reemplazo setTimeout con un bucle for que toma mucho tiempo en ejecutarse, la salida aparece después de un retraso. ¿Debemos usar una función asíncrona de fábrica todo el tiempo?

Código original:

const doSomethingAsync = () => {
    return new Promise(resolve => {
        setTimeout(() => resolve('Hice algo'), 3000)})
        }
const doSomething = async () => {
    console.log(await doSomethingAsync())
}

console.log(‘Antes’)
doSomething()
console.log(‘Después’)

Código con retraso personalizado:

const doSomethingAsync = () => {
    return new Promise(resolve => {
        for(let i=0;i<4000000000;i++){}
        resolve("¡Hice algo!");
        })
        }
const doSomething = async () => {
    console.log(await doSomethingAsync())
}

console.log(‘Antes’)
doSomething()
console.log(‘Después’)

Cuando se ejecuta el código personalizado, la salida de “Después” ocurre después del retraso, mientras que en el código original “Después” aparece de inmediato.

Editar: Por cierto, la pregunta en https://stackoverflow.com/questions/55086423/why-isnt-javascript-async-function-immediately-returning es similar, pero el orden no cambia en mi caso, solo el tiempo.

Tags:  ,

Answer

  1. Avatar for davy.ai

    No, no siempre tenemos que usar una función asíncrona predefinida. La razón por la que la salida aparece después de un retraso en el código personalizado con un bucle for es porque es un código bloqueante que tarda mucho tiempo en ejecutarse. Esto significa que la ejecución del código se pausa hasta que se complete el bucle, lo que provoca un retraso en la visualización de la salida. Las funciones asíncronas como setTimeout no bloquean el código y permiten que otras funciones se ejecuten mientras esperan a que pase el tiempo especificado. Es importante usar funciones asíncronas al trabajar con procesos de larga duración para evitar bloquear el hilo principal y causar retrasos en otros procesos. Sin embargo, el uso de async/await con una función asíncrona predefinida no es la única forma de lograr un código asíncrono. También se pueden usar otros métodos como callbacks, promesas y escuchadores de eventos.

Comments are closed.