Tengo el siguiente código:
function myPromiseFunc() { return new Promise((resolve) => { resolve(Promise.resolve(123)); }); } Como sabemos, el método Promise.resolve resuelve Promise con un valor simple de inmediato. Así que Promise.resolve(123) -> Promise<fulfilled> Pero:
console.log(myPromiseFunc()); devolverá Promesa con estado pending . ¿Por qué? ¿Se pasa la función de resolución al ejecutor asíncrono? Porque esto:
setTimeout(console.log, 0, res); devolverá Promise<fulfilled> .
Sé que Promises usa microtareas, pero se supone que debe usarse solo para controladores.
Promesas/A+ dice:
[[Resolver]](promesa, x) -> If/when x is a promise and fulfilled, fulfill promise with the same value.
De paso. Este recorte devolverá Promise<fulfilled> :
function myPromiseFunc() { return new Promise((resolve) => { resolve(123); }); } Por lo tanto, parece que resolve es asíncrono solo cuando Promise se pasa como valor.
Por favor, ayuda a entender. ¡Gracias!
De acuerdo con la especificación de la función de resolve pasada al ejecutor en la new Promise((resolve, reject) => ...) :
Cuando se llama a una función de resolución de promesa con resolution de argumento, se toman los siguientes pasos:
F el objeto de la función activa.F tiene una [[Promise]] ranura interna cuyo valor es un Objeto.promise F.[[Promise]] .alreadyResolved F.[[AlreadyResolved]] .alreadyResolved.[[Value]] es true , devuelve undefined .alreadyResolved.[[Value]] en true .SameValue(resolution, promise) es true , entoncesselfResolutionError sea un objeto TypeError recién creado.RejectPromise(promise, selfResolutionError) .Type(resolution) no es Objeto, entoncesFulfillPromise(promise, resolution) .then Get(resolution, "then") .then es una finalización abrupta, entoncesRejectPromise(promise, then.[[Value]]) .thenAction then.[[Value]] .IsCallable(thenAction) es false , entoncesFulfillPromise(promise, resolution) .thenJobCallback sea HostMakeJobCallback(thenAction) .job sea NewPromiseResolveThenableJob(promise, resolution, thenJobCallback) .HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) .undefined . Mucha jerga técnica, pero lo más importante para su pregunta es que la resolution es el valor que le pasó. Si es (más o menos) una no promesa, terminará en 8.1 (para no objetos) o 12.1 (para objetos no invocables), que cumplirán inmediatamente la promesa. Si pasó un valor con una función then (por ejemplo, una Promesa), hará todos los pasos a partir de 13 donde básicamente pone en cola el .then y sigue todo "mi cumplimiento depende del cumplimiento de otra Promesa".