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

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

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

开心每一天1111 2019-03-13 18:15:30
题目描述求解这段代码的输出顺序:console.log('begin');setTimeout(() => {  console.log('setTimeout 1');  Promise.resolve()    .then(() => {      console.log('promise 1');      setTimeout(() => {        console.log('setTimeout2');      });    })    .then(() => {      console.log('promise 2');    });      new Promise(resolve => {    console.log('a');    resolve();  }).then(() => {    console.log('b');  });}, 0);console.log('end');实际输出顺序为:beginendsetTimeout 1apromise 1bpromise 2setTimeout2谁能解释一下为什么是这个顺序呢?万分感谢
查看完整描述

4 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

同步状态下顺序执行
Promise 新建后立即执行, then 在当前脚本所有同步任务执行完才会执行, then方法返回的是一个新的Promise实例
Promise.resolve方法允许调用时不带参数,直接返回一个resolved状态的 Promise 对象。
事件队列里面 Promise 比 setTimeout 早执行
所以应该是这样:
=> 'begin'
=> 定义了一个异步setTimeout 1,先放到事件队列(setTimeout 1),继续同步执行
=> 'end'
=> 同步代码执行完成,开始执行异步 setTimeout 1 代码
=> 'setTimeout 1'
=> 定义了异步Promise.resolve,返回一个 Promise1 ,先放到事件队列(Promise1),继续同步执行
=> 新建Promise 立即执行
=> 'a'
=> 同步代码执行完毕,返回新的Promise , 先放到事件队列(Promise1,Promise)
=> 开始执行 Promise1
=> 'promise 1'
=> 继续同步执行,定义了一个异步setTimeout 2, 放到事件队列(Promise,setTimeout 2)
=> Promise1同步代码执行完毕,返回一个 Promise2, 放到事件队列(Promise,setTimeout 2,Promise2)
=> 同步代码执行完毕,执行 Promise代码
=> 'b'
=> Promise 完毕,队列中还有 Promise2 和 setTimeout 2
=> 先 Promise2
=> 'promise 2'
=> 继续 setTimeout 2
=> 'setTimeout2'



查看完整回答
反对 回复 2019-04-15
  • 4 回答
  • 0 关注
  • 593 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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