Quiero saber qué sucede en este fragmento de código con la cadena de .then s con respecto a la pila, la sección WebAPI y la cola de microtareas. Lo he probado en Lupa pero no parecía registrar los .then s.

setTimeout(function() {console.log(2)}, 0);

Promise.resolve(1)
.then((value) => {console.log(value)}) //
.then((value) => {console.log(value)}) //

Es el hecho de que los .then s tienen que esperar hasta que el .then anterior devuelva una promesa resuelta (encadenamiento de .then) lo que me confunde. No estoy seguro de cómo se ve esto. Mi conjetura sería:

La primera (y única) vez que se ejecuta el script, reconoce .then como una función asincrónica que devuelve una promesa, por lo que lo hace en la sección WebAPI. La promesa que toma el primer .then (Promise.resolve1) es sincrónica y se resuelve bastante de inmediato, por lo que la devolución de llamada de .then ((value) => {console.log(value)}) se coloca de inmediato en la microtarea cola. Quizás el script ve que hay una cadena .then y deja el resto de ellos ya que todos dependen unos de otros.

No hay nada más que mirar y 'principal' / el script se extrae de la pila. Ahora, la devolución de llamada que había estado esperando en la cola de microtareas se inserta en la pila y se ejecuta. Genial, la devolución de llamada registra 5 y la devolución de llamada ayuda al primer .then a devolver una promesa cumplida con undefined como su 'resultado'. El segundo .then se invoca inmediatamente en esta nueva promesa. Voy a detenerme aquí porque no me siento seguro.

Sería genial tener una explicación paso a paso de lo que sucede, con respecto a la pila de llamadas, el 'hilo' o 'área' de WebAPI y la cola de la micro-pila.

0
tonitone120 26 ago. 2020 a las 00:59

1 respuesta

La mejor respuesta

La devolución de llamada ayuda al primer .then a devolver una promesa cumplida con undefined como su 'resultado'. El segundo .then se invoca inmediatamente en esta nueva promesa.

No. Los métodos .then(…) se invocan durante la ejecución inicial del script principal y ambos devuelven inmediatamente una nueva promesa (que, sin embargo, aún no se ha resuelto). Una promesa es solo un objeto normal y se puede pasar y registrar como cualquier otro valor, el script ejecuta las llamadas al método normalmente.

Lo que hacen las invocaciones .then(…) además de devolver la nueva promesa es registrar las devoluciones de llamada como controladores de cumplimiento / rechazo en la promesa original, sin ejecutarlas. (Cuando la promesa ya se ha cumplido, como en el ejemplo que dio, también programa inmediatamente la ejecución de los controladores, colocándolos en la cola de microtask).

Después de que el primer manejador se ejecuta en una microtarea y ha registrado el número, su valor de retorno se usa para resolver la promesa de que .then() había regresado. Se programará la ejecución de cualquier controlador registrado en esa promesa. Entonces, cuando se completa la primera microtarea, una segunda ya estará esperando en la cola y ejecutará el segundo controlador con el valor del resultado, lo que lo hará registrar undefined, y luego se resolverá la última promesa de la cadena, pero no ya no hay más controladores para programar y la cola de microtask estará vacía.

2
Bergi 25 ago. 2020 a las 22:14