Según tengo entendido, una promesa es algo que puede resolver () o rechazar (), pero me sorprendió descubrir que el código de la promesa continúa ejecutándose después de que se llama a resolver o rechazar.
Consideré que resolver o rechazar es una versión de salida o retorno compatible con asíncronos, que detendría la ejecución inmediata de todas las funciones.
¿Alguien puede explicar la idea 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
promise
ecmascript-6
es6-promise
Ludwig Van Beethoven
fuente
fuente
resolve()
no es una declaración de control de JS que mágicamente tendría el efecto dereturn
, es solo una llamada de función, y sí, la ejecución continúa después de ella.Respuestas:
JavaScript tiene el concepto de "ejecutar hasta el final" . A menos que se arroje un error, una función se ejecuta hasta que
return
se alcanza una declaración o su final. Otro código fuera de la función no puede interferir con eso (a menos que, nuevamente, se arroje un error).Si desea
resolve()
salir de su función de inicializador, debe anteponerla conreturn
:fuente
resolve()
sí misma es una función asincrónica. Como vimos en la otra respuesta (eliminada), algunas personas creen que las llamadasresolve
ejecutarán inmediatamente cualquier devolución de llamada.resolve
sí no es asincrónico, es completamente sincrónico. Aunque se usa estrictamente la API de ES6, no se puede observar si es sincrónica o asincrónica.resolve
darán lugar a que las devoluciones de llamada registradas se invoquen inmediatamente de modo que formen parte de la pila de llamadas actual. Eso no es cierto, en cambio, solo pone en cola las devoluciones de llamada (y tiene razón, no es asincrónico, pero simplemente hace lo suyo y termina inmediatamente)console.log
en lugar de por qué aparece en ese orden. Hasta ahora, lo queresolve
hace y cómo promete es irrelevante para cómo interpreto la pregunta. Pero, por supuesto, sigue siendo importante saberlo en el contexto de las promesas. Una de las razones por las que voté a favor de tu respuesta :)Las devoluciones de llamada que se invocarán cuando usted haga
resolve
una promesa aún son requeridas por la especificación para ser llamadas asincrónicamente. Esto es para asegurar un comportamiento consistente cuando se utilizan promesas para una combinación de acciones sincrónicas y asincrónicas.Por lo tanto, cuando invoca,
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 laresolve()
llamada.Solo una vez que se devuelve el control al bucle de eventos JS, se puede eliminar la devolución de llamada de la cola y realmente se invoca.
fuente
EnqueueJob
, que es invocado por.then
.