Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

198
Vistas
¿Se pasa la función de resolución al ejecutor Promise asíncrono?

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!

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

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:

  1. Sea F el objeto de la función activa.
  2. Afirmar: F tiene una [[Promise]] ranura interna cuyo valor es un Objeto.
  3. Sea promise F.[[Promise]] .
  4. Sea alreadyResolved F.[[AlreadyResolved]] .
  5. Si alreadyResolved.[[Value]] es true , devuelve undefined .
  6. Establezca alreadyResolved.[[Value]] en true .
  7. Si SameValue(resolution, promise) es true , entonces
    1. Deje que selfResolutionError sea un objeto TypeError recién creado.
    2. Devuelve RejectPromise(promise, selfResolutionError) .
  8. Si Type(resolution) no es Objeto, entonces
    1. Devuelve FulfillPromise(promise, resolution) .
  9. Sea then Get(resolution, "then") .
  10. Si then es una finalización abrupta, entonces
    1. Devuelve RejectPromise(promise, then.[[Value]]) .
  11. Sea thenAction then.[[Value]] .
  12. Si IsCallable(thenAction) es false , entonces
    1. Devuelve FulfillPromise(promise, resolution) .
  13. Deje que thenJobCallback sea HostMakeJobCallback(thenAction) .
  14. Deje que job sea NewPromiseResolveThenableJob(promise, resolution, thenJobCallback) .
  15. Ejecute HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) .
  16. Devolver 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".

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda