Node.js中的Timers

Node.js中有三个和定时相关的API: setTimeout(), setInterval(), setImmediate(),他们都位于timers模块中。而且timers模块是全局模块,不需要用require导入就可以使用。

setTimeout

setTimeout()的第一个参数时一段时间后执行的函数,第二个参数多少毫秒(ms)后;但是Node.js无法保证毫秒不差,只能保证不早于设置的时间。

返回Timeout对象,可以使用clearTimeout()取消定时任务,也可以使使用unref()函数改变其行为。

setImmediate

setImmediate()的执行时间是当前时间循环周期(event loop cycle)的最后,它表示其后的任何代码都会先于setImmediate*()中的回调函数的执行。

可以使用clearImmediate()函数取消定时任务。

和process.nextTick()的区别

  1. process.nextTick()的执行先于setImmediate();
  2. process.nextTick()的执行不可以被取消。

setInterval

setTimeout()一样,setInterval()也返回Timeout对象,也同样可以被取消,只不过是通过clearInterval()函数。同样可以使用Timeout对象的unref()修改预设的定时行为。

总结

返回值 是否可以取消
setTimeout Timeout 是,clearTimeout/unref
setInterval Timeout 是,clearInterval/unref
setImmediate Immediate 是,clearImmediate

容易忽略的

看文档才知道他们都有一个参数args,用来向回调函数传递参数:

1
2
3
setTimeout((...args) => console.log(args), 1000, 1, 21, 3); // output: [1, 21, 3]
setImmediate((...args) => console.log(args), 2, 3, 4); // output: [2, 3, 4]
setInterval((...args) => console.log(args), 3000, 1, 2, 1); // output: [1, 2 ,1]

参考

  1. 官方文档: https://nodejs.org/dist/latest-v10.x/docs/api/timers.html
  2. Timers in Node.js and beyond: https://nodejs.org/en/docs/guides/timers-in-node/
  3. The Node.js Event Loop, Timers, and process.nextTick(): https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/