Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

199
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!