Así que soy nuevo en las promesas y estoy probando algunas cosas para descubrir qué está pasando debajo del capó. Por lo que leí, un trabajo se pone en cola en la cola de Microtask. Luego, inmediatamente después de la promesa, el método se encadenó para resolver.
Promise.resolve("FIRST") .then((m) => console.log(m)) .then(() => console.log("FIRST on second level")) .then(() => console.log("FIRST on third level")) .then(() => console.log("FIRST on fourth level")); Promise.resolve("SECOND") .then((m) => console.log(m)) .then(() => console.log("SECOND on second level")) .then(() => console.log("SECOND on third level")) .then(() => console.log("SECOND on fourth level")); Promise.all([ Promise.resolve("Middle 1 resolved"), Promise.resolve("Middle 2 resolved"), ]).then((results) => console.log(results));Entonces, está bien, el primero .entonces de la PRIMERA cadena se pone en cola de inmediato. Lo mismo ocurre con el primero de la SEGUNDA cadena. Pero ambos devuelven promesas que estarán pendientes hasta que se ejecuten los dos primeros trabajos en cola. Entonces, ¿por qué el registro es así?
FIRST SECOND FIRST on second level SECOND on second level [ 'Middle 1 resolved', 'Middle 2 resolved' ] FIRST on third level SECOND on third level FIRST on fourth level SECOND on fourth level¿Por qué el registro "medio" no se coloca antes de "PRIMERO en el segundo nivel"? Porque asumí por lo que leí que la promesa devuelta de Promise.all EN ESTE EJEMPLO se resolverá siempre que la pila esté vacía y, por lo tanto, se pondrá en cola justo después de los dos primeros:
then(m => console.log(m)) //on line 2 and line 8Entonces, ¿dónde estoy equivocado? ¿Qué me estoy perdiendo o no entiendo correctamente? ¡Gracias de antemano!
Promise.all crea una nueva promesa, y para que sepa cuándo resolver esa promesa, debe llamar a .then en cada una de las promesas que le pasa. Entonces, primero deben resolverse las promesas en la matriz, luego la promesa creada por Promise.all puede resolverse, y solo entonces se llama a su console.log.
En otras palabras, hay 2 niveles de llamadas a .then , al igual que sus otros ejemplos de segundo nivel. Es solo que un nivel está oculto dentro de la implementación de Promise.all
Si ayuda, aquí hay una aproximación de lo que está haciendo Promise.all:
function all(promises) { return new Promise((resolve) => { let count = 0; let results = []; for (let i = 0; i < promises.length; i++) { promises[i].then(result => { count++; results[i] = result; if (count === promises.length) { resolve(results); } }); } }); }