promise输出结果题

1.进入到script标签,就进入到了第一次事件循环.
2.遇到同步代码,立即执行
3.遇到宏任务,放入到宏任务队列里.
4.遇到微任务,放入到微任务队列里.
5.执行完所有同步代码
6.执行微任务代码
7.微任务代码执行完毕,本次队列清空
8.寻找下一个宏任务,重复步骤1

console.log(1)
new Promise((resolve, reject) => {
    console.log(2)
    resolve()
}).then(res => {
    console.log(3)
})
console.log(4)
/* 输出
* 1 -> 2 -> 4 ->3 
*/
('script start')
setTimeout(function () {
    console.log('setTimeout')
}, 0)
async1()
new Promise((resolve) => {
    console.log('promise1')
    resolve()
}).then(function () {
    console.log('promise2')
})
console.log('script end')
//输出
//script start
//async1 start
//async2
//promise1
//script end
//async1 end
//promise2
//setTimeout

必会题:

setTimeout(function(){ 
  console.log('setTimeout 1') 
},0); 
new Promise(resolve => { 
  console.log('script end'); 
  setTimeout(function() { 
    resolve() 
  }, 0) 
}).then(function () { 
  console.log('promise resolve 1') 
}).then(function () { 
  console.log('promise resolve 2') 
}); 
Promise.resolve().then(function () { 
  console.log('promise resolve 3') 
}); 
console.log('script start')

这个代码这里要考虑到promise里有个setTimeout是宏任务。
整个解题思路是:
遇到第一个setTimeout放入宏任务队列中
Promise then方法是微任务,之前的都不是。所以首先执行打印script end,然后setTimout放入宏任务队列中,此时resolve还未执行,promise还处于pending状态,所以不向下执行把两个then放入微任务队列,在向下遇到Primise.resolve.then 返回了状态,把then加入微任务队列中,本次宏任务执行结束后执行,然后执行同步代码打印script start。宏任务执行完了执行微任务打印promise resolve 3,然后执行宏任务中最先完成(相同时间,最先加入)的setTimout,打印setTimeout 1,然后执行第2个宏任务,resolve之后,状态变为fulfilled,把两个then方法加入微任务队列,本次宏任务执行结束后执行。宏任务执行完毕执行微任务,执行打印promise resolve 1和promise resolve 2.
打印顺序是:
script end
script start
promise resolve 3
setTimout 1
promise resolve 1
promise resolve 2

延申:如果在第二个setTimout内加打印

setTimeout(function(){ 
  console.log('setTimeout 1') 
},0); 
new Promise(resolve => { 
  console.log('script end'); 
  setTimeout(function() { 
    console.log('setTimeout 2')
    resolve() 
    console.log('after resolve')
  }, 0) 
}).then(function () { 
  console.log('promise resolve 1') 
}).then(function () { 
  console.log('promise resolve 2') 
}); 
Promise.resolve().then(function () { 
  console.log('promise resolve 3') 
}); 
console.log('script start')

那么setTimeout 2和after resolve会在setTimeout 1之后执行打印
删除promise中的setTimeout,可以看到执行结果是
script end
setTimeout 2
after resolve
script start
promise resolve 1
promise resolve 3
promise resolve 2
setTimeout 1
也就是说promise.then方法之前的代码,包括执行了resolve之后的代码都是同步执行的。
另外能观察到promise resolve 32前执行。这是我判断失误的地方。这里的执行不是按照加入顺序了。
不,我之后再思考了一下,这里还是按照加入顺序的,只不过第一个promise中的第二个then微任务的加入是在第一个执行结束之后,才会加入。因为then执行结束后会返回一个promise。而promise resolve 3的微任务已经被加入了,所以先执行3 再执行后被加入的2
可以多加几个看看效果:
setTimeout(function(){ 
  console.log('setTimeout 1') 
},0); 
new Promise(resolve => { 
  console.log('script end'); 
  resolve() 
}).then(function () { 
  console.log('promise resolve 1') 
}).then(function () { 
  console.log('promise resolve 2') 
}).then(function () {
    console.log("promsie resolve 5")
}); 
Promise.resolve().then(function () { 
  console.log('promise resolve 3') 
}).then(function(){
    console.log('promise resolve 4') 
}); 
console.log('script start')

执行结果:
script end
script start
promise resolve 1
promise resolve 3
promise resolve 2
promise resolve 4
promsie resolve 5
setTimeout 1

可以看到是猜想的这样,1执行完之后加入2 3执行完之后加入4 2执行完了加入5.在本次循环的微任务队列被清空后,才执行最先的宏任务。

假如从最开始再变形一下,去掉promise中整个的setTimeout,也就是没有resolve,也没有两个then方法加入微任务。

setTimeout(function(){ 
  console.log('setTimeout 1') 
},0); 
new Promise(resolve => { 
  console.log('script end');
}).then(function () { 
  console.log('promise resolve 1') 
}).then(function () { 
  console.log('promise resolve 2') 
}); 
Promise.resolve().then(function () { 
  console.log('promise resolve 3') 
}); 
console.log('script start')

script end
script start
promise resolve 3
setTimeout 1

这题也是执行完一个then之后再把另一个then加进去的题。

new Promise((resolve, reject) => {
    console.log(1);
     resolve();
   })
   .then((a) => {
    console.log(2);
     new Promise((resolve,reject) => {
      console.log(3);
       resolve();
     })
     .then((c) => {
      console.log(4);
     })
     .then((d) => {
      console.log(6);
     })
   })
   .then((b) => {
    console.log(5);
   });
//1 2 3 4 5 6
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值