关于Promise经典面试题

JS的事件循环和任务队列:

http://www.ruanyifeng.com/blog/2014/10/event-loop.htmlicon-default.png?t=M1FBhttp://www.ruanyifeng.com/blog/2014/10/event-loop.html

异步任务里面的微任务和宏任务:

https://zhuanlan.zhihu.com/p/364020645icon-default.png?t=M1FBhttps://zhuanlan.zhihu.com/p/364020645

问题:

setTimeout(() => {
    console.log(1);
}, 20);

setTimeout(() => {
    console.log(2);
}, 0);  //=>默认会有最小的等待时间(V8一般是5~6MS)

console.time('WHILE');
let i = 0;
while (i <= 99999999) {
    i++;
}
console.timeEnd('WHILE');

setTimeout(() => {
    console.log(3);
}, 10);

console.log(4);

运行结果:4 2 1 3

流程:

js引擎先从上到下执行代码,遇到1这个setTimeout后,交给定时器线程就不管了,然后继续执行到2这个setTimeout后也交给定时器线程不管了,继续执行到while循环,正常跑完,这里用时247ms,这个过程中前面的1和2的setTimeout由于设置的延迟时间是20和0(注释写了实际上并不是0,而是几ms)所以肯定是已经执行完了,所以就放到任务队列里面去了(2在前,1在后),js引擎继续执行到3的setTimeout继续交给定时器线程,最后执行到console.log(4) 就直接打印出来了,所以首先打印4,在js引擎执行完了所有的同步任务后,就回去异步任务队列里面找当前可以执行的任务,首先会执行2这个setTimeout的回调,所以打印2,这就是一个事件循环了,继续这么循环:先执行同步任务,由于这里没有同步任务了,所以继续去异步任务队列里面取下一个可执行的任务执行,然后打印1,以此类推,最后打印3,所以顺序就是 4, 2 1 3。

注意:

不是到定时器就放进任务队列,是定时器的时间结束了才把定时器里面的函数放进任务队列。

任务队列里面存放的就是一个一个回调函数,比如定时器的回调,点击事件的回调,请求事件的回调这些,这些回调函数就是等js引擎空了来执行的,js引擎会按照先来后到的顺序取出来执行。

如果循环执行时间小于10ms,先3后1,否则先1后3。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值