(二)node 中的定时器

(一)node 中的定时器有四种

(1)setTimeout

(2)setInterval

(3)setImmediate

(4)process.nextTick()

这四个定时器的执行顺序经常被拿来和Promise放在一起考

(二)执行顺序

同步的代码执行一定会在异步的代码之前,异步任务可以分成两种。

  • 追加在本轮循环的异步任务
  • 追加在次轮循环的异步任务

Node 规定,process.nextTick 和 Promise的回调函数,追加在本轮循环,即同步任务一旦执行完成,就开始执行它们。

setTimeoutsetIntervalsetImmediate的回调函数,追加在次轮循环。

(1)本轮循环

在本轮循环中,微任务队列追加在process.nextTick队列的后面,先process.nextTick,再Promise微任务

基本上,如果你希望异步任务尽可能快地执行,那就使用process.nextTick

本轮循环任务先后顺序:

  1. 同步任务
  2. process.nextTick()
  3. 微任务

(2)次轮循环

node只有一个主线程,事件循环是在主线程上完成的,事件循环会无限次地执行,一轮又一轮。只有异步任务的回调函数队列清空了,才会停止执行。

setTimeoutsetIntervalsetImmediate的回调函数,追加在次轮循环

(1)setInterval定时器的问题在于,它并非精确的(在容忍范围内)。尽管事件循环十分快,但是如果某一次循环占用的时间较多,那么下次循环时,它也许已经超时很久了。譬如通过setTimeout()设定一个任务在10毫秒后执行,但是在9毫秒后,有一个任务占用了5毫秒的CPU时间片,再次轮到定时器执行时,时间就已经过期4毫秒

(2)setTimeout会早于setImmediate完成。

在node中,setTimeout(f, 0)等同于setTimeout(f, 1),因为 Node 做不到0毫秒,最少也需要1毫秒

 

下面的输出结果:

setTimeout(() => console.log(1));
setImmediate(() => console.log(2));
process.nextTick(() => console.log(3));
Promise.resolve().then(() => console.log(4));
(() => console.log(5))();

答案:

5
3
4
1
2

同步代码是最先执行的~

------------------------------------------------------------------------------------------------

1. clearImmediate可以被用于取消安排的定时任务

var immediate = setImmediate((arg) => {
  console.log(`executing immediate: ${arg}`);
}, 'so immediate')

clearImmediate(immediate)

2. process.nextTick() 是不可擦除的,换句话说,一旦有代码使用 process.nextTick() 执行,执行无法中断

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值