【发布时间】:2020-11-13 02:01:58
【问题描述】:
new Promise((resolve,reject) => {
console.log('outer promise')
resolve()
})
.then(() => {
console.log('outer 1 then')
new Promise((resolve,reject) => {
console.log('in promise')
resolve()
})
.then(() => {
console.log('in 1 then')
return Promise.resolve()
})
.then(() => {
console.log('in 2 then')
})
})
.then(() => {
console.log('outer 2 then')
})
.then(() => {
console.log('outer 3 then')
})
.then(() => {
console.log('outer 4 then')
})
这是我的解释:
1.执行new Promise,输出outer promise
2.然后执行第一个外层,它的回调进入微任务队列。然后第二个外层,然后第三个外层和第四个外层然后执行,但是它们的所有回调都没有进入队列,因为每个每个 then 返回的 promise 仍处于挂起状态。
3.然后执行第一个outer的回调,输出outer 1 then。之后new Promise会输出in promise
4.然后执行第一个内部,它的回调进入微任务队列。第二个内部的回调然后不进入队列
5.现在,第一个outer的回调已经全部结束,也就是说第一个outer返回的promise已经解决了。于是,第二个outer的回调就进入了队列
6.执行队列的第一个任务,输出outer 2 then,并回调第三个任务进入队列。接下来,执行第二个内部任务的回调,输出in 2 then
7.然后执行第三个outer的回调,它会输出outer 3 then,并做第四个的回调然后进入队列。
8.最后执行第四个outer的回调,会输出outer 4 then
因此,输出顺序应该是:
outer promise
outer 1 then
in promise
in 1 then
outer 2 then
in 2 then
outer 3 then
outer 4 then
但它实际上输出:
outer promise
outer 1 then
in promise
in 1 then
outer 2 then
outer 3 then
outer 4 then
in 2 then
我很困惑的是为什么in 2 then最后会输出?为什么outer 2 then,outer 3 then,outer 4 then会连续输出?这与我对事件循环的想法不同。我认为结果与语句return Promise.resolve()有关,但我不知道该语句究竟做了什么以及为什么它会影响输出顺序。
【问题讨论】:
-
首先你必须返回承诺
-
我知道,每个
then都会返回一个承诺 -
我说的是你的
new Promise在第一个调用中,如果你不返回它,那将立即解决 -
但由于 promise 处于已解决状态,因此它也会立即解决
-
不,不会。对承诺的
then调用将返回一个新的待处理承诺。如果回调被执行,那只会解决(或拒绝)。Promise.resolve().then(x => x) //=> Promise { <state>: "pending" }
标签: javascript event-loop