为了账号安全,请及时绑定邮箱和手机立即绑定

Promise的一道面试题,麻烦指导一下!

Promise的一道面试题,麻烦指导一下!

江户川乱折腾 2019-03-05 18:15:30
最近在看Promise相关知识,遇到一个面试题,以我的理解,应该是先输出a failed,然后b failed b passed的,可是为什么a failed在中间输出了??
查看完整描述

5 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

强调:Promise的每个then或catch都是异步执行的。


因此,实际上最先执行的是a.then,但没有定义catch,所以抛出异常,然后异步交给后面的catch处理(a failed)。此时下一个等待执行的是b.catch(b failed),处理完之后,同样异步交给后面的then(b passed)。接着,之前排队的catch(b failed)执行,最后b passed执行。


这就是各个then/catch交替执行的原因。


整个过程类似于下面的代码:


setTimeout(function(){

    console.log(1);

    setTimeout(function(){

        console.log(2);

    }, 0);

}, 0);


setTimeout(function(){

    console.log(3);

    setTimeout(function(){

        console.log(4);

    }, 0);

}, 0);

结果打印1 3 2 4,而不是1 2 3 4。


查看完整回答
反对 回复 2019-03-21
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

catch 本质也是 Promise.prototype.then 的封装,所以 a 相当于跳过了一轮循环,整个过程可以这么理解


reject('a')

reject('b')


(next turn)


reject('a') -> handle(onReject) 没 handler,传递下去

reject('b') -> handle(onReject) 这里被 catch 处理


(next turn)


reject('a') -> handle(onReject) -> handle(onReject) 这里被 catch 处理

reject('b') -> handle(onReject) -> handle(onFullfill)


查看完整回答
反对 回复 2019-03-21
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

此句是错的 catch对于已经完成的promise同步执行 此句是错的

then异步执行(类型setTimeout(xxx,0))


查看完整回答
反对 回复 2019-03-21
  • 5 回答
  • 0 关注
  • 516 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号