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代码)
Oct 29 Javascript
详解JavaScript基本类型和引用类型
Dec 09 Javascript
jQuery fadeOut 异步实例代码详解
Aug 18 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
Dec 12 Javascript
vue弹窗组件使用方法
Apr 28 Javascript
读懂CommonJS的模块加载
Apr 19 Javascript
微信小程序:数据存储、传值、取值详解
May 07 Javascript
vue输入节流,避免实时请求接口的实例代码
Oct 30 Javascript
vue实现的多页面项目如何优化打包的步骤详解
Jul 19 Javascript
JavaScript实现点击切换功能
Jan 27 Javascript
如何利用JavaScript实现二叉搜索树
Apr 02 Javascript
HTML+JS实现在线朗读器
Feb 15 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
WAR3重制版DOTA 5V5初体验
2020/04/09 DOTA
多重?l件?合查?(二)
2006/10/09 PHP
在PHP3中实现SESSION的功能(一)
2006/10/09 PHP
简单的页面缓冲技术
2006/10/09 PHP
简单的cookie计数器实现源码
2013/06/07 PHP
ThinkPHP CURD方法之table方法详解
2014/06/18 PHP
php图像处理类实例
2015/07/28 PHP
学习ExtJS(一) 之基础前提
2009/10/07 Javascript
jQuery UI的Dialog无法提交问题的解决方法
2011/01/11 Javascript
javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
2011/04/12 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
详解JS中Array对象扩展与String对象扩展
2016/01/07 Javascript
jquery插件bootstrapValidator数据验证详解
2016/11/09 Javascript
简述Angular 5 快速入门
2017/11/04 Javascript
使用Vue自定义数字键盘组件(体验度极好)
2017/12/19 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
2020/07/19 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
python并发编程之线程实例解析
2017/12/27 Python
Python 解决相对路径问题:"No such file or directory"
2020/06/05 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
2020/08/04 Python
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
大学生学业生涯规划
2014/01/05 职场文书
项目开发计划书
2014/01/09 职场文书
公司成立感言
2014/01/11 职场文书
公司开业庆典主持词
2014/03/21 职场文书
合作意向书范本
2014/03/31 职场文书
企业宣传策划方案
2014/05/29 职场文书
湖南省召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
简易离婚协议书(范本)
2014/10/25 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
Vue.js中v-for指令的用法介绍
2022/03/13 Vue.js
mysql5.5中文乱码问题解决的有用方法
2022/05/30 MySQL