node.js中的定时器nextTick()和setImmediate()区别分析


Posted in Javascript onNovember 26, 2014

1.node中使用定时器的问题在于,它并非精确的.譬如setTimeout()设定一个任务在10ms后执行,但是在9ms后,有一个任务占用了5ms,再次轮到定时器时,已经耽误了4ms.

好了node中的定时器就简单的讲这么多.

2.看代码:

process.nextTick(function(){

    console.log("延迟执行");

});

console.log("正常执行1");

console.log("正常执行2");

console.log("正常执行3");

console.log("正常执行4");

node.js中的定时器nextTick()和setImmediate()区别分析

通过这个例子,我想大家很清楚的就能看到nextTick()是用来干嘛的了.主要是用来异步执行的.

在看代码:

 setImmediate(function(){

     console.log("延迟执行");

 });

 console.log("正常执行");

node.js中的定时器nextTick()和setImmediate()区别分析

我们发现setImmediate也是异步执行的.奇怪了

那么它与nextTick()有什么区别呢?

看代码:

代码一:

process.nextTick(function(){

    console.log("nextTick延迟")

});

setImmediate(function(){

    console.log("setImmediate延迟");

});

console.log("正常执行");

结果:

node.js中的定时器nextTick()和setImmediate()区别分析

代码二:

setImmediate(function(){

    console.log("setImmediate延迟");

});

process.nextTick(function(){

    console.log("nextTick延迟")

});

console.log("正常执行");

结果:

node.js中的定时器nextTick()和setImmediate()区别分析

发现代码虽然顺序不一样,但是执行的结果是一样的.

从结果可以发现:

nextTick()的回调函数执行的优先级要高于setImmediate();

process.nextTick()属于idle观察者,setImmediate()属于check观察者.在每一轮循环检查中,idle观察者先于I/O观察者,I/O观察者先于check观察者.

在具体实现上,process.nextTick()的回调函数保存在一个数组中,
setImmediate()的结果则是保存在链表中.
在行为上,process.nextTick()在每轮循环中会将数组中的回调函数全部执行完.
而setImmediate()在每轮循环中执行链表中的一个回调函数.

//加入2个nextTick()的回调函数

process.nextTick(function(){

    console.log("nextTick延迟执行1");

});

process.nextTick(function(){

    console.log("nextTick延迟执行2");

});

//加入两个setImmediate()回调函数

setImmediate(function(){

    console.log("setImmediate延迟执行1");

    process.nextTick(function(){

        console.log("强势插入");

    });

});

setImmediate(function(){

    console.log("setImmediate延迟执行2");

});

console.log("正常执行");

node.js中的定时器nextTick()和setImmediate()区别分析

从执行结果上看出:当第一个setImmediate()的回调函数执行完后,并没有立即执行第二个,而是进入了下一轮循环,再次按nextTick()优先,setImmediate()次后的顺序执行.之所以这样设计,是为了保证每次循环能够较快的执行结束.防止CPU占用过多而阻塞后续I/O调用的情况.

以上就是相关node.js中的定时器nextTick()和setImmediate()区别的资料了,小伙伴们是否清楚了他们之间的区别了呢?

Javascript 相关文章推荐
探讨JavaScript中的Rest参数和参数默认值
Jul 29 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
Oct 02 Javascript
原生JS和jQuery版实现文件上传功能
Apr 18 Javascript
JavaScript绑定事件监听函数的通用方法
May 14 Javascript
jQuery学习笔记之入门
Dec 14 Javascript
js浏览器滚动条卷去的高度scrolltop(实例讲解)
Jul 07 Javascript
element-ui循环显示radio控件信息的方法
Aug 24 Javascript
node版本管理工具n包使用教程详解
Nov 09 Javascript
jQuery实现的卷帘门滑入滑出效果【案例】
Feb 18 jQuery
小程序新版订阅消息模板消息
Dec 31 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
May 23 Javascript
Openlayers学习之加载鹰眼控件
Sep 28 Javascript
JavaScript定义类和对象的方法
Nov 26 #Javascript
node.js操作mongoDB数据库示例分享
Nov 26 #Javascript
教你如何使用node.js制作代理服务器
Nov 26 #Javascript
浅析node.js中close事件
Nov 26 #Javascript
node.js超时timeout详解
Nov 26 #Javascript
node.js+Ajax实现获取HTTP服务器返回数据
Nov 26 #Javascript
使用node.js 获取客户端信息代码分享
Nov 26 #Javascript
You might like
php的chr和ord函数实现字符加减乘除运算实现代码
2011/12/05 PHP
Zend Guard使用指南及问题处理
2015/01/07 PHP
PHP微信红包API接口
2015/12/05 PHP
php+MySQL实现登录时验证登录名和密码是否正确
2016/05/10 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
2019/10/13 PHP
javascript 常用代码技巧大收集
2009/02/25 Javascript
jQuery 处理网页内容的实现代码
2010/02/15 Javascript
jQuery中大家不太了解的几个方法
2015/03/04 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
js document.getElementsByClassName的使用介绍与自定义函数
2016/11/25 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
2016/12/01 Javascript
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
在一个页面实现两个zTree联动的方法
2017/12/20 Javascript
解决vue 项目引入字体图标报错、不显示等问题
2018/09/01 Javascript
Vue.js 中的 v-show 指令及用法详解
2018/11/19 Javascript
原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】
2019/08/15 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
python中的多重继承实例讲解
2014/09/28 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
详解Python安装scrapy的正确姿势
2018/06/26 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
2019/06/13 Python
mac系统下Redis安装和使用步骤详解
2019/07/09 Python
Python GUI库PyQt5样式QSS子控件介绍
2020/02/25 Python
Python内置异常类型全面汇总
2020/05/28 Python
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
教师实习期自我鉴定
2013/10/06 职场文书
电钳专业个人求职信
2014/01/04 职场文书
社团2014年植树节活动总结
2014/03/11 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
个人总结格式范文
2015/03/09 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
MySQL 分页查询的优化技巧
2021/05/12 MySQL
django学习之ajax post传参的2种格式实例
2021/05/14 Python