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()的区别
process.nextTick()
的执行先于setImmediate()
;process.nextTick()
的执行不可以被取消。
setInterval
和setTimeout()
一样,setInterval()
也返回Timeout
对象,也同样可以被取消,只不过是通过clearInterval()
函数。同样可以使用Timeout
对象的unref()
修改预设的定时行为。
总结
返回值 | 是否可以取消 | |
---|---|---|
setTimeout | Timeout | 是,clearTimeout/unref |
setInterval | Timeout | 是,clearInterval/unref |
setImmediate | Immediate | 是,clearImmediate |
容易忽略的
看文档才知道他们都有一个参数args
,用来向回调函数传递参数:
1 | setTimeout((...args) => console.log(args), 1000, 1, 21, 3); // output: [1, 21, 3] |
参考
- 官方文档: https://nodejs.org/dist/latest-v10.x/docs/api/timers.html
- Timers in Node.js and beyond: https://nodejs.org/en/docs/guides/timers-in-node/
- The Node.js Event Loop, Timers, and process.nextTick(): https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/