Node. js中的定时器是一种会在一段时间后调用给定的函数的内部构造。何时调用定时器函数取决于用来创建定时器的方法,以及Node.js事件循环正在执行的其他工作。
Node. js定义了setImmediate(callback[,……args])方法,用于设定定时器为立即执行定时器。其中参数:callback<Function>指在当前回合的Node.js事件循环结束时调用的函数;……args<any>指当调用callback时传入的可选参数。
当多次调用setImmediate()时,callback函数将按照创建它们的顺序排队等待执行。每次事件循环迭代都会处理整个回调队列。如果立即(immediate)定时器是从正在执行的回调排入队列,则直到下一次事件循环迭代才会触发。
如果callback不是函数,则抛出TypeError。
此方法具有使用util.promisify()的用于Promise的自定义变体。
setInterval(callback, delay[,……args])方法,用于设定定时器执行的周期,定时器每隔delay毫秒重复执行一次。其中参数:callback<Function>指在当前回合的Node.js事件循环结束时调用的函数;delay<number>指调用callback之前等待的毫秒数;……args<any>指当调用callback时传入的可选参数。
当delay大于2 147 483 647(即32位整型的最大值)或小于1时,delay将设置为1。
如果callback不是函数,则抛出TypeError。
setTimeout(callback, delay[,……args])方法,用于在上一次定时器执行的delay毫秒之后设定定时器执行时机。其中参数:callback<Function>指在当前回合的Node.js事件循环结束时调用的函数;delay<number>指调用callback之前等待的毫秒数;……args<any>指当调用callback时传入的可选参数。
可能不会精确地在delay毫秒时调用callback。Node.js不保证回调被触发的确切时间,也不保证它们的顺序。callback会在尽可能接近指定的时间调用。
同setInterval一样,当delay大于2 147 483 647(即32位整型的最大值)或小于1时,delay将设置为1。
如果callback不是函数,则抛出TypeError。
此方法具有使用util.promisify()的用于Promise的自定义变体。
setInterval和setTimeout这两个方法的参数是一样的,其区别在于定时执行的时点不同。
setInterval是每间隔一定时间执行一次,循环往复。例如,每隔1秒执行一次,60秒过后执行了60次。setTimeout是过了一定时间执行一次,只执行一次。例如,隔1秒后执行一次,过了十万八千秒后也只在第一秒执行了一次。
图6-1展示了setInterval和setTimeout的执行差异。
图6-1 setInterval和setTimeout的异同
在图6-1中,setInterval每个定时器执行的间隔都是固定的,不管doStuff需要执行多久,都能按照固定的时间间隔来执行。而在setTimeout中,下一个定时的时间间隔取决于doStuff的执行耗时,换言之,下个定时的时间间隔可以等同于doStuff的执行耗时加上delay。