zoukankan      html  css  js  c++  java
  • Node中的定时器详解

        在大多数的业务中,我们都会有一些需求,例如几秒钟实现网页的跳转,几分钟对于后台数据进行清理,node与javascript都具有将代码延迟一段时间的能力。在node中可以使用三种方式实现定时功能:超时时间,时间间隔和即时定时器。虽然有这三种定时器功能但是在平常的业务中使用还是有差别的,下来我们就一起讨论一下这三种定时器。

        1、用超时时间来延迟工作

        超时定时器用于将工作延迟一个特定的时间数量,当时间到了,回调函数执行,而定时器会消失。(建议:对于只执行一次的工作,使用超时时间)。

        1秒之后执行myFunc,函数

        setTimeout(myFunc,1000);

        当你调用setTimeout()时,回调函数myFunc会在1000毫秒之后执行。

        2、时间间隔执行定期工作

        时间间隔定时器用于按照定期的延时时间间隔执行工作,当延迟时间结束时,回调函数被执行,然后再次重新调度该时间为延时时间,相当于一个轮询功能,定期执行函数。

        每秒中执行一次myFunc()

        setInterval(myFunc,1000);

        setInterval()函数会返回一个定时器对象ID,利用这个clearInterval(id)可以取消时间间隔定时器

        例如:

        id = setInterval(myFunc,1000);

        clearInterval(id);

        3、使用即时计时器立即执行工作

        即时计时器用来在I/O事件的回调函数开始执行后,单任何超时间时间或者间隔时间事件被执行之前,立即执行工作。它们允许你把工作调度为在事件队列中的当前事件完成之后执行。

        setImmediate(myFunc,1000);

        代码调度myFunc()在遍历时间队列的下一个周期内执行。

        注意:还有一个是nextTick来调度工作

        在事件队列上调度工作的一个非常有用的办法就是使用process.nextTick(callback)函数,这个函数可能会导致I/O的饥饿,所以node通过设置默认值为1000的process.maxTickDepth来限制事件队列的每次循环可执行的nextTIck()的数目。

        接下来写一个小的Demo来看看这几个定时器的一些区别。

        

     1 console.log('成功开启node,端口号:'+app.get('port'));
     2     setImmediate(function(){
     3         console.log("setImmediate1");
     4     },1000);
     5     process.nextTick(function(){
     6         console.log("nextTick1");
     7     });
     8     setImmediate(function(){
     9         console.log("setImmediate2");
    10     },1000);
    11     process.nextTick(function(){
    12         console.log("nextTick2");
    13     });
    14     console.log("---------------");

        运行结果如下:

      

        从上面的结果中可以看到,首先输出的是两个nextTick(),也就是说,这个函数在任何调用之前执行,之后是两个setImmediate()。这就好比是说,nextTick()函数提前进入了VIP仓,提前登机了~(哈哈~~这句比喻是在和大牛们的讨论中出来的,便于大家理解,要是有说的不清楚的地方,请大家批评指正。)

        注:本文的参考资料来源是《Node.js+MongoDB+AngularJS Web开发》,作者:Brad Dayley ,卢涛  李颖 译,在此对本书的作者以及翻译者表示感谢。

        

        

        

  • 相关阅读:
    idea启动tomcat服务失败
    500错误 javax.servlet.ServletException: javax.naming.NameNotFoundException: Name [happy] is not bound in this Context. Unable to find [happy].
    idea启动tomcat服务失败 SEVERE [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild:
    浅谈注解式开发
    PTA编程总结3
    PTA编程总结2
    PTA编程总结1
    秋季学期学习总结
    Git简明教程
    Linux常用软件安装
  • 原文地址:https://www.cnblogs.com/DonaHero/p/5894673.html
Copyright © 2011-2022 走看看