点击上方蓝字关注“小郑搞码事”,每天都能学到知识,搞懂一个问题!

在日常的工作中,我们时不时碰到一些这样的需求,例如几秒钟实现网页的跳转,几分钟对后台数据进行一次处理,node和JavaScript都具有将代码延迟一段时间的能力,这里我们专门讲讲node,在node中,可以使用三种方式实现定时功能:1、超时时间;2、时间间隔;3、即时定时器。在平常使用中, 这三者还是有差别的,下面我们一个一个来看。

nodejs关闭服务器(node.js-定时器)(1)

全文的实例部分,我们会用到一个停止时间函数sleep,它的实现也很简单:

nodejs关闭服务器(node.js-定时器)(2)

这段代码第一种用法输出a b。第二种用法不输出,因为clearTimeout清除了定时器对象。

setInterval:属于时间间隔定时器,按照定期的延时时间间隔执行工作,当延迟时间结束,回调函数被执行,等回调函数执行结束后,再次重新调度该时间为延时间,循环往复。它也有两种用法,如下图所示:

nodejs关闭服务器(node.js-定时器)(3)

这段代码第一种用法输出aaabbb,同样第二段代码不输出,因为我们使用了clearInterval清除了定时对象。

注意的是:setInterval一定是等到回调函数执行完成后,再进行下一次延时间定义。比如:

setInterval(function(){ sleep(5000); },1000)

这个程序,输出结果是这样的:

nodejs关闭服务器(node.js-定时器)(4)

从结果可以看出,是每隔6秒钟才输出的。

二、ref与unref

上面可以看出,setTimeout方法与setInterval函数均返回一个定时器对象。然而,在Node.js中,为定时器对象定义了一个unref方法与一个ref方法。他们的作用也很简单,当使用setTimeout函数指定过多少毫秒调用某个回调函数或使用setInterval函数指定每隔多少毫秒调用某个回调函数后,可以使用setTimeout函数或者setInterval函数返回定时器对象的unref方法停止setTimeout函数或setInterval函数中指定的回调函数的调用(相反,ref方法就是启动)。

下面举一个例子:

nodejs关闭服务器(node.js-定时器)(5)

上面这个代码存储在index.js文件中,我们在控制台运行node index.js,等待两秒后,就会看到输出:“等2秒后,输出信息”。本来,一开始就应该输出信息的,因为我们用了unref方法停止了setTimeout函数的回调函数的调用,紧接着我们用了一个sleep函数将程序停止了2秒,之后,调用ref启动setTimeout函数回调函数调用。

这两个方法需要注意的是:1、当调用两个或者两个以上的setTimeout的时候,这两个方法就不会起作用。2、这两个方法是node.js的方法,一定在node环境下运行,否则会报"is not a function"的错误。

三、setImmediate与process.nextTick

setImmediate:即时计时器,指任何超时时间或者间隔时间事件被执行之前,立即执行工作,相当于setTimeout的时间为0,可以传参数但时间不能设置,只能时间一直为0的效果。用法和上面定时器一样,如下图所示:

nodejs关闭服务器(node.js-定时器)(6)

process.nextTick:主线程完成之后对列的第一个执行,setTimeout,setInterval,setImmediate都是在运行的队列中。下面我们相较于setlmmediate方法,来看一下两者的区别:

nodejs关闭服务器(node.js-定时器)(7)

上面代码的输出顺序是"输出一","输出二","输出三dd;bb"。

四、最后总结

关于node.js定时器模块,官网有更详细的介绍,理解起来也并不难,总的来说,内容就这些,在应用的时候需要理解的更深一点,回头我在写node.js实例的时候,涉及到定时任务,在详细一点。

以上纯属个人理解,如有不对的地方,请留言交流!!

,