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

哪个老哥解释一下这个Promise为什么是这样的输出顺序

哪个老哥解释一下这个Promise为什么是这样的输出顺序

沧海一幻觉 2019-05-08 16:24:12
题目描述求解这段代码的输出顺序:console.log('begin');setTimeout(()=>{console.log('setTimeout1');Promise.resolve().then(()=>{console.log('promise1');setTimeout(()=>{console.log('setTimeout2');});}).then(()=>{console.log('promise2');});newPromise(resolve=>{console.log('a');resolve();}).then(()=>{console.log('b');});},0);console.log('end');实际输出顺序为:beginendsetTimeout1apromise1bpromise2setTimeout2谁能解释一下为什么是这个顺序呢?万分感谢
查看完整描述

2 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

同步状态下顺序执行Promise新建后立即执行,then在当前脚本所有同步任务执行完才会执行,then方法返回的是一个新的Promise实例Promise.resolve方法允许调用时不带参数,直接返回一个resolved状态的Promise对象。事件队列里面Promise比setTimeout早执行所以应该是这样:=>'begin'=>定义了一个异步setTimeout1,先放到事件队列(setTimeout1),继续同步执行=>'end'=>同步代码执行完成,开始执行异步setTimeout1代码=>'setTimeout1'=>定义了异步Promise.resolve,返回一个Promise1,先放到事件队列(Promise1),继续同步执行=>新建Promise立即执行=>'a'=>同步代码执行完毕,返回新的Promise,先放到事件队列(Promise1,Promise)=>开始执行Promise1=>'promise1'=>继续同步执行,定义了一个异步setTimeout2,放到事件队列(Promise,setTimeout2)=>Promise1同步代码执行完毕,返回一个Promise2,放到事件队列(Promise,setTimeout2,Promise2)=>同步代码执行完毕,执行Promise代码=>'b'=>Promise完毕,队列中还有Promise2和setTimeout2=>先Promise2=>'promise2'=>继续setTimeout2=>'setTimeout2'
                            
查看完整回答
反对 回复 2019-05-08
  • 2 回答
  • 0 关注
  • 781 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信