Promise.all 什么时候真正排队微任务?

When does Promise.all actually queue a microtask?

所以我是 promises 的新手,我正在尝试一些东西来弄清楚引擎盖下发生了什么。从我读到的,一个作业被排队到 Microtask 队列。然后在承诺之后立即将方法链接到 resolves。

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));

好吧,FIRST链的第一个.then立即排队。 SECOND 链的第一个也是如此。但是他们都 return 承诺在前两个排队的作业被执行之前将一直等待。那为什么日志是这样的:

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

为什么“中间”日志没有放在“FIRST on second level”之前?因为我从我读到的内容假设 returned from Promise.all 在这个例子中 将解决只要堆栈是空的,因此它的 .then将在前两个之后立即排队:

then(m => console.log(m)) //on line 2 and line 8

所以我哪里错了?我错过了什么或没有正确理解什么? 提前致谢!

Promise.all 创建一个新的承诺,并且为了让它知道何时解决该承诺,它需要对您传递给它的每个承诺调用 .then 。因此,首先数组中的 promise 必须解析,然后由 Promise.all 创建的 promise 可以解析,只有这样你的 console.log 才会被调用。

换句话说,对 .then 有 2 级调用,很像您的其他二级示例。只不过在Promise.all

的实现里面隐藏了一层

如果有帮助,下面是 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);
        }
      });
    }
  });
}