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和C#的异同
May 31 Javascript
通过Javascript创建一个选择文件的对话框代码
Jun 16 Javascript
js实现鼠标滑过文字链接色彩变化的效果
May 06 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
Nov 23 Javascript
Vue之Watcher源码解析(2)
Jul 19 Javascript
使用vue2.0创建的项目的步骤方法
Sep 25 Javascript
vue实现前台列表数据过滤搜索、分页效果
May 28 Javascript
JS字符串与二进制的相互转化实例代码详解
Jun 28 Javascript
JavaScript 截取字符串代码实例
Sep 05 Javascript
layer.open组件获取弹出层页面变量、函数的实例
Sep 25 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
Oct 30 Javascript
基于Web Audio API实现音频可视化效果
Jun 12 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数据流应用的一个简单实例
2012/09/14 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
PHP时间相关常用函数用法示例
2020/06/03 PHP
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
javascript页面加载完执行事件代码
2014/02/11 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
Jquery 分页插件之Jquery Pagination
2015/08/25 Javascript
javascript实现复选框全选或反选
2017/02/04 Javascript
Ajax基础知识详解
2017/02/17 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
2017/07/05 Javascript
微信小程序之批量上传并压缩图片的实例代码
2018/07/05 Javascript
React父子组件间的传值的方法
2018/11/13 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
vue实现禁止浏览器记住密码功能的示例代码
2021/02/03 Vue.js
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[38:39]KG vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
HTML5 File接口在web页面上使用文件下载
2017/02/27 HTML / CSS
化工专业大学生职业生涯规划书
2014/01/14 职场文书
我们的节日清明节活动方案
2014/03/05 职场文书
技术总监管理岗位职责
2014/03/09 职场文书
培训科主任岗位职责
2014/08/08 职场文书
2015年餐厅服务员工作总结
2015/04/23 职场文书
Python基础详解之邮件处理
2021/04/28 Python
Django中session进行权限管理的使用
2021/07/09 Python
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android
MySQL详细讲解变量variables的用法
2022/06/21 MySQL