Promise.resolve().then(res=>{
console.log(1)
return Promise.resolve()
}).then(res=>{
console.log(2)
})
Promise.resolve().then(res=>{
console.log(3)
}).then(res=>{
console.log(4)
}).then(res=>{
console.log(5)
}).then(res=>{
console.log(6)
})
//打印
// 1
// 3
// 4
// 5
// 2
// 6
打印2的位置 怎么解释呢
第二次编辑:
根据看到的文章描述
return Promise.resolve()
这一步在原生实现中实际上有2个步骤:执行完以上之后,第一个promise才真正resolve,console.log(2)所在的回调函数才加入微任务队列,这才解释了为什么2在5和6之间打印
根据这个机制再来按顺序捋一遍,就符合了打印的顺序
第一次编辑:
实际用vscode调试发现和我的猜想不同
把问题的代码替换成相同效果的代码:
输出顺序和原代码一致:
在单步调试的时候,发现按行数的执行顺序实际是:
令我没想到的是,return的promise没有在console.log(4)和console.log(5)的then执行后才resolve,相反,是先resolve然后console.log(2)的then都执行了才轮到4、5的then执行。看来then的执行和进入任务队列的先后没有必然关系,之前的回答还是从结果出发去猜过程,等我找找相关的资料再重新审视这个问题
原回答:
执行
return Promise.resolve()
后,其他微任务都已经入栈了,然后这个promise才从pending到resolved状态,所以console.log(2)
所在的回调函数最后入栈执行