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 相关文章推荐
[HTML/CSS/Javascript]WWTJS
Sep 25 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
Mar 17 Javascript
js加减乘除丢失精度问题解决方法
May 16 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
Mar 13 Javascript
javascript动画之模拟拖拽效果篇
Sep 26 Javascript
JavaScript SHA1加密算法实现详细代码
Oct 06 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
Jan 19 Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
Jun 12 Javascript
react开发教程之React 组件之间的通信方式
Aug 12 Javascript
简单谈谈CommonsChunkPlugin抽取公共模块
Dec 31 Javascript
vue.js实现备忘录demo
Jun 26 Javascript
ant-design-vue按需加载的坑的解决
May 14 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 设计模式之 工厂模式
2008/12/19 PHP
php实现的ping端口函数实例
2014/11/12 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
2015/12/16 PHP
Swoole实现异步投递task任务案例详解
2019/04/02 PHP
IE与FireFox的兼容性问题分析
2007/04/22 Javascript
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
javascript制作2048游戏
2015/03/30 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
JS实现的表格行上下移动操作示例
2016/08/03 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
从零开始封装自己的自定义Vue组件
2018/10/09 Javascript
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
Vue中遍历数组的新方法实例详解
2019/07/21 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
python冒泡排序简单实现方法
2015/07/09 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
利用pandas进行大文件计数处理的方法
2018/07/25 Python
python实现图片识别汽车功能
2018/11/30 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
python 经典数字滤波实例
2019/12/16 Python
pytorch模型存储的2种实现方法
2020/02/14 Python
Python如何实现后端自定义认证并实现多条件登陆
2020/06/22 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
python 实现"神经衰弱"翻牌游戏
2020/11/09 Python
Keds官方网站:购买帆布运动鞋和经典皮鞋
2016/11/12 全球购物
写好自荐信要注意的问题
2013/11/10 职场文书
数据员岗位职责
2013/11/19 职场文书
中学生家长评语大全
2014/04/16 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
离婚起诉书范本
2015/05/18 职场文书
授权协议书范本(3篇)
2019/10/15 职场文书
Python list列表删除元素的4种方法
2021/11/01 Python