console.log('Start'); const myFunc = async () => { for(let i=0; i<10000000000000; i++){} console.log('After for loop'); } myFunc(); console.log('end');
Quiero un comportamiento asíncrono usando async/await. Quiero que mi función pase toda la función a un ciclo de eventos igual que SetTimeout, SetInterval lo hace para que mi subproceso principal pueda continuar haciendo el resto a menos que esa funcionalidad pesada se esté ejecutando detrás de escena.
Salida esperada: inicio, fin, después del bucle for
Salida actual: inicio, después de bucle, final
Su comprensión del código javascript asíncrono no es correcta.
La función que se pasa a setTimeout
no se ejecuta en segundo plano : se ejecuta en el subproceso principal y mientras se ejecuta esa función, no se ejecuta nada más.
Es solo que la función de devolución de llamada de setTimeout
se inserta en la pila de llamadas después de que el temporizador haya expirado y la pila de llamadas esté vacía. Esta es la razón por la que se puede ejecutar otro código antes de que se ejecute la función de devolución de llamada de setTimeout
.
Algunas funciones proporcionadas por el navegador, como las solicitudes HTTP, ocurren en segundo plano y, una vez que se completan, Javascript invocará nuestra función de devolución de llamada y, una vez que esa función de devolución de llamada comience a ejecutarse, bloquea todo lo demás hasta que esa función se elimine de la pila de llamadas.
Poner su código dentro de una función async
no hace que su código sea asíncrono ; se ejecutará sincrónicamente hasta la primera expresión de espera . (Las promesas no hacen que nada sea asíncrono. Son solo un mecanismo de notificación que le informa sobre la finalización exitosa o la falla de algo que ya es asíncrono).
Lo que necesita es otro subproceso que ejecute el código de ejecución prolongada sin bloquear el subproceso principal. Puede hacer esto usando un trabajador web en el navegador o un subproceso de trabajo en NodeJS.