setTimeout和setImmediate以及process.nextTick的区别

《第二届阿里巴巴前端练习生计划线上笔试》考试

setTimeout和setImmediate以及process.nextTick的区别

在这里插入图片描述

SetTimeOut

setTimeout和setInterval函数执行顺序相似,需要注意的是,setTimeout()只是将事件插入了"任务队列",必须等到执行栈执行完,主线程才会去执行它指定的回调函数。要是当前代码耗时很长(如有for循环),有可能要等很久,所以并没有办法保证,回调函数一定会在setTimeout()指定的时间执行。

setTimeout(function(){console.log('0')},0);
//意思是回调函数加入事件队列的队尾,主线程和事件队列的函数执行完成之后立即执行定时器的回调函数,如果定时器的定时是相同的,就按定时器回调函数的先后顺序来执行。
console.log(1);
setTimeout(function(){console.log(2);},1000);
setTimeout(function(){console.log(4);},1000);
console.log(3);
//1 3 0 2 4

SetImmediate

setImmediate()是将事件插入到事件队列尾部,主线程和事件队列的函数执行完成之后立即执行setImmediate指定的回调函数,和setTimeout(fn,0)的效果差不多,但是当他们同时在同一个事件循环中时,执行顺序是不定的。
结论:
在 文件I/O、网络I/O 中,setImmediate()会先于setTimeout(fn,0)
其他一般情况下,setTimeout(fn,0)会先于setImmediate()
在这里插入图片描述

执行结果在这里插入图片描述

process.nextTick()

process.nextTick()方法可以在当前"执行栈"的尾部待下一次Event Loop(主线程读取"任务队列")之前触发process指定的回调函数。也就是说,它指定的任务总是发生在所有异步任务之前,当前主线程的末尾。(nextTick虽然也会异步执行,但是不会给其他io事件执行的任何机会)

process.nextTick(function A() {
  console.log(1);
  process.nextTick(function B(){console.log(2);});
});

setTimeout(function C() {
  console.log(3');
}, 0)
// 1
// 2
// 3

执行顺序:
主线程>微任务>宏任务
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值