快速掌握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操作页面表格,元素的一些技巧
Feb 02 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
Apr 16 Javascript
用JS实现轮播图效果(二)
Jun 26 Javascript
轻松掌握JavaScript单例模式
Aug 25 Javascript
H5移动端图片压缩上传开发流程
Nov 09 Javascript
Bootstrap CSS布局之表单
Dec 17 Javascript
使用vue.js编写蓝色拼图小游戏
Mar 17 Javascript
Require.JS中的几种define定义方式示例
Jun 01 Javascript
10分钟上手vue-cli 3.0 入门介绍
Apr 04 Javascript
小程序如何自主实现拦截器的示例代码
Nov 04 Javascript
JavaScript This指向问题详解
Nov 25 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
Dec 26 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
PHP脚本的10个技巧(3)
2006/10/09 PHP
php下MYSQL limit的优化
2008/01/10 PHP
PHP小程序自动提交到自助友情连接
2009/11/24 PHP
smarty实现多级分类的方法
2014/12/05 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
PHP强制转化的形式整理
2020/05/22 PHP
实现51Map地图接口(示例代码)
2013/11/22 Javascript
jQuery封装的获取Url中的Get参数示例
2013/11/26 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
javascript鼠标右键菜单自定义效果
2020/12/08 Javascript
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python中使用中文的方法
2011/02/19 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
在Python中使用gRPC的方法示例
2018/08/08 Python
浅谈Django中view对数据库的调用方法
2019/07/18 Python
python实现飞机大战项目
2020/03/11 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
和平主题的演讲稿
2014/01/12 职场文书
养殖项目策划书范文
2014/01/13 职场文书
学校联谊活动方案
2014/02/15 职场文书
校园安全教育广播稿
2014/02/17 职场文书
招股说明书范本
2014/05/06 职场文书
白血病捐款倡议书
2014/05/14 职场文书
电话客服工作职责
2014/07/27 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
村干部群众路线整改措施思想汇报
2014/10/12 职场文书
离婚协议书包括哪些内容
2014/10/16 职场文书
2014年行政工作总结
2014/11/19 职场文书
运动会表扬稿
2015/01/16 职场文书
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python