Según entiendo, una promesa es algo que puede resolver() o rechazar(), pero me sorprendió descubrir que el código en la promesa continúa ejecutándose después de que se llama a resolver o rechazar.
Consideré resolver o rechazar como una versión asincrónica de exit o return , que detendría toda la ejecución inmediata de funciones.
¿Alguien puede explicar el pensamiento detrás de por qué el siguiente ejemplo a veces muestra el archivo console.log después de una llamada de resolución?
var call = function() { return new Promise(function(resolve, reject) { resolve(); console.log("Doing more stuff, should not be visible after a resolve!"); }); }; call().then(function() { console.log("resolved"); });JavaScript tiene el concepto de "ejecutar hasta completar" . A menos que se arroje un error, una función se ejecuta hasta que se alcanza una declaración de return o se alcanza su final. Otro código fuera de la función no puede interferir con eso (a menos que, nuevamente, se produzca un error).
Si desea que resolve() salga de su función de inicialización, debe anteponerla con return :
return new Promise(function(resolve, reject) { return resolve(); console.log("Not doing more stuff after a return statement"); });La especificación aún requiere que las devoluciones de llamada que se invocarán cuando resolve una promesa se llamen de forma asincrónica. Esto es para garantizar un comportamiento coherente cuando se usan promesas para una combinación de acciones sincrónicas y asincrónicas.
Por lo tanto, cuando invoque resolve , la devolución de llamada se pone en cola y la ejecución de la función continúa inmediatamente con cualquier código que siga a la llamada resolve() .
Solo una vez que se devuelve el control al bucle de eventos JS, la devolución de llamada se puede eliminar de la cola y se puede invocar.
La función resolve() no se parece en nada a return . Simplemente indica que el argumento de la función de devolución de llamada que se registró con el método then() ahora está listo y la función de devolución de llamada puede abandonar potencialmente la cola de trabajo (o la cola de microtarea) e ingresar a la pila de llamadas JS principal, pero eso solo sucede cuando todos los códigos síncronos y los códigos asíncronos que ingresaron a la cola antes de que este terminara de ejecutarse. console.log("Not doing more stuff after a return statement"); esta declaración en su código es un código síncrono y tiene prioridad sobre los códigos asíncronos. Por eso corre primero