首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Promise面试题,给你答案求原因?来挑战

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

作者头像
用户9914333
发布2022-07-22 14:23:33
发布2022-07-22 14:23:33
3370
举报
文章被收录于专栏:bug收集bug收集

最近遇到一道面试题,运行出来的答案和想象的有点不一样。

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

面试题:

代码语言:javascript
复制
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)
    })

结果为:


关于,promise.then() 是微任务的知识,可参考如下文章:

快速理解宏任务与微任务

可是,即便了解微任务,但为啥4会在3后执行呢?

是否也想不通(可先上网查询)?

思考?

思考?

思考?

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

下面来看看大佬 紫云飞 的解释(来源:知乎):

大家以为 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()}} 试试。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 bug收集 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档