¿Hay algún detalle de especificación/implementación sobre qué tan "ansiosa" es la evaluación de las devoluciones de llamada de una promesa? Quiero decir, digamos que tengo
var promise = new Promise((resolve) => { resolve() }); console.log(promise); // there is no public field '<state>', but you can see it in the console of the dev tools Veo que la promise ya se cumplió; Esperaba que la implementación interna de Promise llamara a la devolución de llamada de resolve en un momento posterior, dejando una "ventana de tiempo" con la promise aún sin cumplir.
¿Es esta evaluación "ansiosa" de la devolución de llamada de resolve "por diseño"? ¿Es esto solo un detalle de implementación?
La devolución de llamada que se pasa al constructor de Promise se ejecuta sincrónicamente por ese constructor. Entonces, cuando el operador new devuelve el objeto construido, la devolución de llamada ya se ha ejecutado.
Esto es por la especificación ECMA Script . El procedimiento para new Promise(excecutor) describe en el paso 9 que se llama al ejecutor y en el paso 11 que se devuelve el objeto de promesa construido.
Los colaboradores de Mozilla escriben :
Sintaxis
new Promise(executor)Parámetros
executorUna función que ejecutará el constructor, durante el proceso de construcción del nuevo objeto
Promise.
La función de devolución de llamada del constructor generalmente se usa para iniciar un proceso asíncrono (basándose en una API asíncrona, como setTimeout ), que puede resolver la promesa en el momento en que la devolución de llamada del constructor ya ha regresado.
function executor(resolve) { setTimeout(resolve, 100); } var promise = new Promise(executor); En su ejemplo, esa devolución de llamada no se basa en una API asíncrona, sino que llama sincrónicamente a la devolución de llamada de resolve . Eso significa que cuando el objeto de promesa construido se asigna a su variable de promise , esa promesa ya se encuentra en un estado cumplido.