一道面试题的问题
来源:8-17 解答JS异步的面试题

CoderL_星系
2021-03-12
new Promise((resolve) => {
console.log(0)
resolve(Promise.resolve(4))
}).then((res) => {
console.log(res)
})
new Promise((resolve) => {
console.log(1);
resolve()
}).then(() => {
console.log(2)
}).then(() => {
console.log(3)
}).then(() => {
console.log(5)
}).then(() => {
console.log(6)
})
老师,我根据视频的理解,这道题输出的应该是0142356,但是为啥最终输出的是0123456呢,主要是不太懂resolve(Promise.resolve(4))这里他的机制是咋样的
3回答
-
慕移动9003747
2021-03-13
因为在这里resolve的是Promise实例,所以会出现个叫PromiseResolveThenableJob的东西,这是个微任务,并且这个微任务会调用一次then函数实现resolve Promise,最终看起来就是then被推迟了两次
20 -
慕莱坞3126862
2021-03-27
感谢分享题目!通过这道题学到了状态追随的知识。浏览器在解析第三行的Promise的时候,发现其new Promise中resolve的是另一个Thenable对象(另一个实例Promise),会创建一个PromiseResolveThenableJob的微任务来完成转换工作,等到第一行的promise被resolved之后,第三行的promise才会被resolved。
这里有个知识点:
浏览器解析类似
new Promise((rs, rj)=>{rs( <other-promise> )})
的代码时,会在微任务中插入一个PromiseResolveThenableJob微任务。如果被追随的Promise的状态被resolved,会立即插入追随者的resolvePromise微任务。这两个微任务的存在导致了对应的输出延迟了两个时序。
而对于
Promise.resolve( <other-promise> )
则无时序变化。
可以参考这里,写的的非常详细:https://zhuanlan.zhihu.com/p/86993504
112021-03-30 -
双越
2021-03-12
我貌似记得在哪里见过这道题,有点印象。
resolve(Promise.resolve(4)) 可以拆解为两句话
const p = Promise.resolve(4) // p 是一个 Promise 对象 resolve(p)
即,这里 resolve 一个 Promise 对象,所以它后面的 then 执行要晚一些。
但我也不清楚,为何 4 会夹杂到 2 3 和 5 6 中间输出,我预期 4 应该是最后输出的。
这块我也没搞懂,我再继续查查。
062021-04-01
相似问题