快速掌握Node.js中setTimeout和setInterval的使用方法


Posted in Javascript onMarch 21, 2016

Node.js和js一样也有计时器,超时计时器、间隔计时器、及时计时器,它们以及process.nextTick(callback)函数来实现事件调度。今天先学下setTimeout和setInterval的使用。

一、setTimeout超时计时器(和GCD中的after类似)

在node.js中可以使用node.js内置的setTimeout(callback,delayMillSeconds,[args])方法。当调用setTime()时回调函数会在delayMillSeconds后

执行.setTime() 会返回一个定时器对象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间隔计时器(和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每隔1s执行一次,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的使用方法有所帮助。

Javascript 相关文章推荐
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
Jun 22 Javascript
node.js中的buffer.slice方法使用说明
Dec 10 Javascript
探讨跨域请求资源的几种方式(总结)
Dec 02 Javascript
Node.js的Mongodb使用实例
Dec 30 Javascript
详解vue事件对象、冒泡、阻止默认行为
Mar 20 Javascript
JS实现图片预览的两种方式
Jun 27 Javascript
vue+element-ui+ajax实现一个表格的实例
Mar 09 Javascript
JS实现电脑虚拟键盘的操作
Jun 24 Javascript
微信小程序实现转盘抽奖
Sep 21 Javascript
antd日期选择器禁止选择当天之前的时间操作
Oct 29 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 Vue.js
vue中 this.$set的使用详解
Nov 17 Vue.js
快速掌握Node.js事件驱动模型
Mar 21 #Javascript
快速掌握Node.js模块封装及使用
Mar 21 #Javascript
JS DOM实现鼠标滑动图片效果
Sep 17 #Javascript
实践中学习AngularJS表单
Mar 21 #Javascript
javascript单页面手势滑屏切换原理详解
Mar 21 #Javascript
javascript实现dom元素可拖动
Mar 21 #Javascript
AngularJS 中的指令实践开发指南(一)
Mar 20 #Javascript
You might like
CakePHP去除默认显示的标题及图标的方法
2008/10/22 PHP
在PHP中使用反射技术的架构插件使用说明
2010/05/18 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
浅谈laravel数据库查询返回的数据形式
2019/10/21 PHP
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
让checkbox不选中即将选中的checkbox不选中
2014/07/11 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
js中日期的加减法
2015/05/06 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
jQuery实现彩带延伸效果的网页加载条loading动画
2015/10/29 Javascript
使用jQuery处理AJAX请求的基础学习教程
2016/05/10 Javascript
AngularJS ng-bind 指令简单实现
2016/07/30 Javascript
jQuery.uploadify文件上传组件实例讲解
2016/09/23 Javascript
利用angular、react和vue实现相同的面试题组件
2018/02/19 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
Vue配置marked链接添加target="_blank"的方法
2019/07/19 Javascript
基于JavaScript实现轮播图效果
2021/01/02 Javascript
Python 第一步 hello world
2009/09/25 Python
Python3搜索及替换文件中文本的方法
2015/05/22 Python
Python打印输出数组中全部元素
2018/03/13 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
谈一谈基于python的面向对象编程基础
2019/05/21 Python
python实现静态web服务器
2019/09/03 Python
python如何利用Mitmproxy抓包
2020/10/10 Python
python 对一幅灰度图像进行直方图均衡化
2020/10/27 Python
python获得命令行输入的参数的两种方式
2020/11/02 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
绿色学校实施方案
2014/03/31 职场文书
门面房租房协议书
2014/12/01 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
运动会通讯稿50字
2015/07/20 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
党员干部学习心得体会
2016/01/23 职场文书
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL