doubleyong
管理员
管理员
  • 最后登录2026-05-25
  • 发帖数1198
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
阅读:6257回复:1

[es 6]Promise面试题,给你答案求原因?来挑战

楼主#
更多 发布于:2021-03-16 21:14
最近遇到一道面试题,运行出来的答案和想象的有点不一样。


大家一起来看看答案,想想原因呢?


面试题:

Promise.resolve()
        .then(() =>{
        console.log(0)
        return Promise.resolve(4)
    })
    .then(res =>{
        console.log(res)})
    Promise.resolve()
    .then(() =>{
        console.log(1)})
    .then(() =>{
        console.log(2)
    })
    .then(() =>{
        console.log(3)})
    .then(() =>{
        console.log(5)
    })
    .then(() =>{
        console.log(6)
    })

结果为:
0
1
2
3
4
5
6

关于,promise.then() 是微任务的知识,可参考如下文章:
快速理解宏任务与微任务


可是,即便了解微任务,但为啥4会在3后执行呢?
是否也想不通(可先上网查询)?


思考?
思考?
思考?


重点就是:对于 return Promise.resolve(4) 的理解


下面来看看大佬 紫云飞 的解释(来源:知乎, 链接:https://www.zhihu.com/question/408642623):


大家以为 Promise.resolve(4) 返回的 promise 对象的状态从 pending 立刻变为  fulfilled,也就是会让再后面的那个 .then 回调立刻进入 microtask 队列。

但其实不是的,如果在一个 pending 状态的 promise 对象(p)的 .then回调里返回一个 promise 对象( p2),或者任意带有 then 方法的对象,引擎会专门起一个额外的 microtask/job 去执行这个 p2的 then 方法,
同时把 p 的 [[resolve]]和 [[reject]]函数作为参数传过去,虽然 p2 已经 fulfilled 了,但它能做的也就是把 [[resolve]] 函数立刻放到 microtask 队列里,这样也就过了两个 microtask,这时 p 才会被 fulfill,p 后面的 console.log('内部第二个then')才会被放入队列。

所以你才看到了慢两拍的表现,只有两拍,如果你 return的是个能同步执行 [[resolve]] 函数的 普通 thenable 对象,那就仅仅会慢一拍,比如你可以返回 { then (  resolve ){resolve()}} 试试。


大家理解了嘛,欢迎大家一起讨论
知识需要管理,知识需要分享
yishuchuiyun
贫民
贫民
  • 最后登录2021-03-17
  • 发帖数1
沙发#
发布于:2021-03-16 21:54
后面这一串好高深哦
游客


返回顶部

公众号

公众号