node.js-定时器
点击上方蓝字关注“小郑搞码事”,每天都能学到知识,搞懂一个问题!
在日常的工作中,我们时不时碰到一些这样的需求,例如几秒钟实现网页的跳转,几分钟对后台数据进行一次处理,node和JavaScript都具有将代码延迟一段时间的能力,这里我们专门讲讲node,在node中,可以使用三种方式实现定时功能:1、超时时间;2、时间间隔;3、即时定时器。在平常使用中, 这三者还是有差别的,下面我们一个一个来看。
全文的实例部分,我们会用到一个停止时间函数sleep,它的实现也很简单:
一、setTimeout与setInterval
setTimout:属于超时定时器,将任务延迟到一个特定的时间,当时间到了,回调函数执行,定时器就消失。它有两种用法,如下图所示:
这段代码第一种用法输出a b。第二种用法不输出,因为clearTimeout清除了定时器对象。
setInterval:属于时间间隔定时器,按照定期的延时时间间隔执行工作,当延迟时间结束,回调函数被执行,等回调函数执行结束后,再次重新调度该时间为延时间,循环往复。它也有两种用法,如下图所示:
这段代码第一种用法输出aaabbb,同样第二段代码不输出,因为我们使用了clearInterval清除了定时对象。
注意的是:setInterval一定是等到回调函数执行完成后,再进行下一次延时间定义。比如:
setInterval(function(){ sleep(5000); },1000)
这个程序,输出结果是这样的:
从结果可以看出,是每隔6秒钟才输出的。
二、ref与unref
上面可以看出,setTimeout方法与setInterval函数均返回一个定时器对象。然而,在Node.js中,为定时器对象定义了一个unref方法与一个ref方法。他们的作用也很简单,当使用setTimeout函数指定过多少毫秒调用某个回调函数或使用setInterval函数指定每隔多少毫秒调用某个回调函数后,可以使用setTimeout函数或者setInterval函数返回定时器对象的unref方法停止setTimeout函数或setInterval函数中指定的回调函数的调用,(相反,ref方法就是启动)。
下面举一个例子:
上面这个代码存储在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的效果。用法和上面定时器一样,如下图所示:
process.nextTick:主线程完成之后对列的第一个执行,setTimeout,setInterval,setImmediate都是在运行的队列中。下面我们相较于setlmmediate方法,来看一下两者的区别:
上面代码的输出顺序是"输出一","输出二","输出三dd;bb"。
四、最后总结
关于node.js定时器模块,官网有更详细的介绍,理解起来也并不难,总的来说,内容就这些,在应用的时候需要理解的更深一点,回头我在写node.js实例的时候,涉及到定时任务,在详细一点。
以上纯属个人理解,如有不对的地方,请留言交流!!
TAG:小郑搞码事 |
※log4js-node配置
※Node.js之express框架
※基於 node.js 的自動路由組件-HttpPostman
※搭建nginx+nodejs伺服器
※blogfoster-scripts:一款簡化 Node.js 項目初始化的工具
※nodejs+mongodb 編寫 restful 風格博客 api
※Node.js進階:cluster模塊深入剖析
※DOM探索之-DOM的nodeType、nodeName、nodeValue
※Shader Graph著色器視圖自定義節點API:Code Function Node
※node整合webstorm
※Windows系統下如何搭建Node.js伺服器詳解
※拒絕 Python、C 和 Go,我只用 Node.js!
※拒絕 Python、C#和Go,我只用 Node.js!
※node+express+mongoDB寫簡單介面,Vue獲取介面
※Node.js應用Linux部署實戰
※Node.js 主題周
※詳解node + mongoDb(mongoDb安裝、運行,在node中連接增刪改查)
※node+pm2+express+mysql+sequelize來搭建網站和寫介面
※川崎病:小兒皮膚黏膜淋巴結綜合征(mucocutaneous lymph node syndrome,MCLS)
※nodejs連接mongodb,對數據增刪改查操作(跳過坑)Windows版