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);
}
});
}
});
}
所以我是 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);
}
});
}
});
}