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

433
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!

over 4 years ago · Santiago Trujillo
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".

over 4 years ago · Santiago Trujillo 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