本文详细介绍 Node.js 中 setTimeout 和 setInterval 定时器的基本用法、参数说明及取消机制。通过代码示例演示如何创建、执行和清除定时器,并深入解析 unref() 方法对事件循环的影响。同时指出定时器执行时间的非精确性,帮助开发者在实际项目中更准确地控制异步任务调度。
Node.js 定时器概述
Node.js 提供了与 JavaScript 类似的计时器功能,包括超时计时器、间隔计时器和即时计时器,这些计时器结合 process.nextTick(callback) 函数共同实现事件调度。本文将重点介绍 setTimeout 和 setInterval 的具体使用方法。
setTimeout 超时计时器用法
一、setTimeout 超时计时器(与 GCD 中的 after 类似)
在 Node.js 中,可以使用内置的 setTimeout(callback, delayMillSeconds, [args]) 方法来创建超时计时器。当调用该方法时,指定的回调函数将在 delayMillSeconds 毫秒后执行。
调用 setTimeout() 会返回一个定时器对象 ID。如果在 delayMillSeconds 到期之前,将该 ID 传递给 clearTimeout(timeoutId),则可以取消该计时器的执行。
function myfunc(){
console.log("myfunc");
};
var mytimeout=setTimeout(myfunc,1000);
clearTimeout(mytimeout);
"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe timer.js
Process finished with exit code 0
如果注释掉代码中的 clearTimeout(mytimeout); 这一行,可以看到 myfunc() 函数会被正常执行。
"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe timer.js
myfunc
Process finished with exit code 0
setInterval 间隔计时器用法
二、setInterval 间隔计时器(与 GCD 中的 dispatch_source_t 或 NSTimer 类似)
间隔计时器用于按固定的时间间隔重复执行任务。与 setTimeout 类似,Node.js 内置了 setInterval(callback, delayMilliSecond, [args]) 方法来创建并返回定时器对象 ID,并通过 clearInterval() 来取消计时器。
/**
* Created by Administrator on 2016/3/11.
*/
function myfunc(Interval){
console.log("myfunc "+Interval);
}
var myInterval=setInterval(myfunc,1000,"Interval");
function stopInterval(){
clearTimeout(myInterval);
//myInterval.unref();
}
setTimeout(stopInterval,5000);
上述代码展示了如何创建 setInterval 的回调函数 myfunc,参数为 Interval。setInterval 每隔 1 秒执行一次,而 setTimeout 在 5 秒后执行,其回调函数用于取消间隔计时器。
"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe Interval.js
myfunc Interval
myfunc Interval
myfunc Interval
myfunc Interval
Process finished with exit code 0
取消定时器引用与性能影响
三、从事件循环中取消定时器引用
当事件队列中仅存在定时器回调函数时,如果希望不再执行它们,可以使用 setInterval 和 setTimeout 返回对象的 unref() 方法,通知事件循环不再继续处理这些定时器。
当 unref() 与 setTimeout 结合使用时,需要独立的计时器来唤醒事件循环。大量使用这种机制会对性能产生影响,因此应尽量减少使用。
定时器执行时间的非精确性
四、setTimeout 和 setInterval 执行时间是不精确的
这两个方法是将回调函数添加到事件队列中,执行时间并不精确。
function simpleTimeout(consoleTime)
{
console.timeEnd(consoleTime);
}
console.time("twoSecond");
setTimeout(simpleTimeout,2000,"twoSecond");
console.time("oneSecond");
setTimeout(simpleTimeout,1000,"oneSecond");
console.time("fiveSecond");
setTimeout(simpleTimeout,5000,"fiveSecond");
console.time("50MillSecond");
setTimeout(simpleTimeout,50,"50MillSecond");
多次运行上述代码,输出的结果会有所不同。
"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe timer.js
50MillSecond: 51ms
oneSecond: 1000ms
twoSecond: 2002ms
fiveSecond: 5001ms
Process finished with exit code 0
以上就是本文的全部内容,希望对大家学习 Node.js 中 setTimeout 和 setInterval 的使用方法有所帮助。