Node.js中使用计时器定时执行函数详解

如果你熟悉客户端JavaScript编程,你可能使用过setTimeout和setInterval函数,这两个函数允许延时一段时间再运行函数。比如下面的代码, 一旦被加载到Web页面,1秒后会在页面文档后追加“Hello there”:

复制代码 代码如下:


var oneSecond = 1000 * 1; // one second = 1000 x 1 ms

setTimeout(function() {

document.write('<p>Hello there.</p>');

}, oneSecond);

而setInterval允许以指定的时间间隔重复执行函数。如果把下面的代码注入到Web页面,会导致每秒钟向页面文档后面追加一句“Hello there”:

复制代码 代码如下:


                  var oneSecond = 1000 * 1; // one second = 1000 x 1 ms

setInterval(function() {

document.write('<p>Hello there.</p>');

}, oneSecond);

因为Web早已成为一个用来构建应用程序的平台,而不再是简单的静态页面,所以这种类似的需求日益浮现。这些任务计划函数帮助开发人员实现表单定期验证,延迟远程数据同步,或者那些需要延时反应的UI交互。Node也完整实现了这些方法。在服务器端,你可以用它们来重复或延迟执行很多任务,比如缓存过期,连接池清理,会话过期,轮询等等。

使用setTimeout延迟函数执行

setTimeout可以制定一个在将来某个时间把指定函数运行一次的执行计划,比如:

复制代码 代码如下:


                   var timeout_ms = 2000; // 2 seconds

var timeout = setTimeout(function() {

console.log("timed out!");

}, timeout_ms);

和客户端JavaScript完全一样,setTimeout接受两个参数,第一个参数是需要被延迟的函数,第二个参数是延迟时间(以毫秒为单位)。

setTimeout返回一个超时句柄,它是个内部对象,可以用它作为参数调用clearTimeout来取消计时器,除此之外这个句柄没有任何作用。

使用clearTimeout取消执行计划

一旦获得了超时句柄,就可以用clearTimeout来取消函数执行计划,像这样:

复制代码 代码如下:


                   var timeoutTime = 1000; // one second

var timeout = setTimeout(function() {

console.log("timed out!");

}, timeoutTime);

clearTimeout(timeout);

这个例子里,计时器永远不会被触发,也不会输出”time out!”这几个字。你也可以在将来的任何时间取消执行计划,就像下面的例子:

复制代码 代码如下:


 var timeout = setTimeout(function A() {
 
                            console.log("timed out!");
 
                   }, 2000);
 
                   setTimeout(function B() {
 
                            clearTimeout(timeout);
 
                   }, 1000);

代码指定了两个延时执行的函数A和B,函数A计划在2秒钟后执行,B计划在1秒钟后执行,因为函数B先执行,而它取消了A的执行计划,因此A永远不会运行。

制定和取消函数的重复执行计划

setInterval和setTimeout类似,但是它会以指定时间为间隔重复执行一个函数。你可以用它来周期性的触发一段程序,来完成一些类似清理,收集,日志,获取数据,轮询等其它需要重复执行的任务。

下面代码每秒会向控制台输出一句“tick”:

复制代码 代码如下:


                   var period = 1000; // 1 second

setInterval(function() {

console.log("tick");

}, period);

如果你不想让它永远运行下去,可以用clearInterval()取消定时器。

setInterval返回一个执行计划句柄,可以把它用作clearInterval的参数来取消执行计划:

复制代码 代码如下:


                   var interval = setInterval(function() {

console.log("tick");

}, 1000);

// …

clearInterval(interval);

使用process.nextTick将函数执行延迟到事件循环的下一轮

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgspff.html