一道面试题的问题

来源: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被推迟了两次

2
0

慕莱坞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

1
1
慕粉3871079
厉害!
2021-03-30
共1条回复

双越

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 应该是最后输出的。

这块我也没搞懂,我再继续查查。

0
6
双越
回复
CoderL_星系
我看有人写了相关的博客,你可以先看着,应该对理解有帮助的 https://juejin.cn/post/6945319439772434469
2021-04-01
共6条回复

一天时间高效准备前端技术一面 匹配大厂面试要求

针对时下面试高频考点,帮助新人js面试快速通关

4709 学习 · 1682 问题

查看课程