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 相关文章推荐
jQuery 常见学习网站与参考书
Nov 09 Javascript
面向对象的Javascript之一(初识Javascript)
Jan 20 Javascript
angularjs指令中的compile与link函数详解
Dec 06 Javascript
js中不同的height, top的区别对比
Sep 24 Javascript
JavaScript数据推送Comet技术详解
Apr 07 Javascript
原生js封装的一些jquery方法(详解)
Sep 20 Javascript
jQuery焦点图轮播效果实现方法
Dec 19 Javascript
SeaJS中use函数用法实例分析
Oct 10 Javascript
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
Dec 28 Javascript
微信小程序实现省市区三级地址选择
Jun 21 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
May 29 Javascript
原生JS实现微信通讯录
Jun 18 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 HandlerSocket的使用
2011/05/02 PHP
PHP中文分词的简单实现代码分享
2011/07/17 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
Zend Framework前端控制器用法示例
2016/12/11 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
MSN消息提示类
2006/09/05 Javascript
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
JavaScript中的变量声明早于赋值分析
2012/03/01 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
2013/10/09 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
javascript入门教程基础篇
2015/11/16 Javascript
JavaScript实现点击按钮直接打印
2016/01/06 Javascript
JS解决iframe之间通信和自适应高度的问题
2016/08/24 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
vue之父子组件间通信实例讲解(props、$ref、$emit)
2018/05/22 Javascript
vue实现键盘输入支付密码功能
2018/08/18 Javascript
微信小程序实现的自定义分享功能示例
2019/02/12 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
layui关闭层级、简单监听的实例
2019/09/06 Javascript
javascript中可能用得到的全部的排序算法
2020/03/05 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
Python中的正则表达式与JSON数据交换格式
2019/07/03 Python
python中dict使用方法详解
2019/07/17 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
2020/02/29 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
Python基于callable函数检测对象是否可被调用
2020/10/16 Python
医学专业个人求职自荐信格式
2013/09/23 职场文书
教堂婚礼主持词
2014/03/14 职场文书
个人公司授权委托书范本
2014/10/12 职场文书
JavaScript 原型与原型链详情
2021/11/02 Javascript