博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node.js中Process.nextTick()和setImmediate()的区别
阅读量:5807 次
发布时间:2019-06-18

本文共 2043 字,大约阅读时间需要 6 分钟。

一、Webstrom使用node.js IDE的问题

在区别这两个函数之前来说一下Webstrom使用node.js IDE的问题,在配置Node.js的IDE了,但setImmediate()、require等这些node.js中内置的函数时并不会有提示,要解决这个问题只要设置一下Webstrom,File---->Setting---->Languages&Frameworks------>Node.js and NPM中的Node.js core Library is not enabled设为Enable.

二、两者的区别

1.在理解两者的区别之前要说一下轮询

前面博客也有记录,nodejs中是事件驱动的,有一个循环线程一直从事件队列中取任务执行或者I/O的操作转给后台线程池来操作,把这个循环线程的每次执行的过程算是一次轮询.

2.setImmediate()的使用

即时计时器立即执行工作,它是在事件轮询之后执行,为了防止轮询阻塞,每次只会调用一个。

3.Process.nextTick()的使用

它和setImmediate()执行的顺序不一样,它是在事件轮询之前执行,为了防止I/O饥饿,所以有一个默认process.maxTickDepth=1000来限制事件队列的每次循环可执行的nextTick()事件的数目。

4.总结

在网上百度的关于它们的总结:

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

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

在具体实现上,process.nextTick()的回调函数保存在一个数组中,

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

5.代码demo

//加入2个nextTick()的回调函数process.nextTick(function(){    console.log("nextTick延迟执行A");});process.nextTick(function(){    console.log("nextTick延迟执行B");    setImmediate(function(){        console.log("setImmediate延迟执行C");    });    process.nextTick(function(){        console.log("nextTick延迟执行D");    });});//加入两个setImmediate()回调函数setImmediate(function(){    console.log("setImmediate延迟执行E");    process.nextTick(function(){        console.log("强势插入F");    });    setImmediate(function(){        console.log("setImmediate延迟执行G");    });});setImmediate(function(){    console.log("setImmediate延迟执行H");    process.nextTick(function(){        console.log("强势插入I");    });    process.nextTick(function(){        console.log("强势插入J");    });    setImmediate(function(){        console.log("setImmediate延迟执行K");    });});console.log("正常执行L");
输出结果:

"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe Immediate.js正常执行LnextTick延迟执行AnextTick延迟执行BnextTick延迟执行DsetImmediate延迟执行EsetImmediate延迟执行HsetImmediate延迟执行C强势插入F强势插入I强势插入JsetImmediate延迟执行GsetImmediate延迟执行KProcess finished with exit code 0
 关于执行顺序的问题很不容易搞明白,说实话现在我对它还是不是太理解,希望有大神能给讲明白。

转载地址:http://joybx.baihongyu.com/

你可能感兴趣的文章
zoj 2412 dfs 求连通分量的个数
查看>>
NLP自然语言处理学习笔记一(环境准备)
查看>>
李开复:中国第四波创业浪潮来临
查看>>
数组中连续重复数据删选且记下所在索引-demo
查看>>
管道和多路复用器
查看>>
第六周作业 百词斩对比可可英语
查看>>
李天平老师回复:如何稳步提高自己的技术?
查看>>
SQL Server 计算汉字笔画函数
查看>>
【算法】LeetCode算法题-Merge Two Sorted List
查看>>
子查询注意这几点, 就可以写出好的sql语句
查看>>
在项目中用run as java aplication调试类
查看>>
python-建造者模式
查看>>
常用模块
查看>>
RadioButtonList中的默认项(Selected)不触发OnSelectedIndexChanged
查看>>
Javascript选择checkbox
查看>>
jQuery系列:Ajax
查看>>
Ruiy自我识人做事领悟录ing
查看>>
shell数组
查看>>
hadoop测试环境主配置简例
查看>>
为PyCharm自动配置作者信息
查看>>