轮训优先级

  • 过期计时器和间隔队列(timer阶段) - 使用 setTimeout 添加的过期计时器的回调或者使用 setInterval 添加的间隔函数。
  • IO 事件队列(IO poll)

如果有任何未决的任务需要处理,事件循环就不会阻塞。如果这里没有未决的任务需要执行,它将会阻塞直到下一个 timer 到期,会重新激活循环,激活循环也是冲setImmediate开始然后转移到timer阶段。

  • 完成的 I/O 事件立即的队列(Immediate queue) - 使用 setImmediate 函数添加的回调
  • 关闭操作队列(Close Handlers Queue) 任何一个 close 事件处理器。
    以上每个阶段完成后都会去微任务队列里面查找是否有微任务,如果有的话就去执行它。

微任务

  • 下一个运转队列(Next Ticks Queue) 使用 process.nextTick() 函数添加的回调

下一个运转队列比微队列有着更高的优先级。尽管它们都在事件循环的两个阶段之间处理,在一个阶段的结尾 libuv 回到 Node 的跟高层进行通信。这意味着在开始处理 promise 的微队列之前,下一个运转队列是空的。

下一个运转队列的优先级比 promise 的高仅仅适合于 V8 提供的原生 JS 提供的 promise。如果你使用一个 q 库或者 bluebird, 你将会观察到一个不同的结果,因为它们提早于原生的 promise,有不同的语义。 q 和 bluebird 处理 promise 也有不同的方式,后面的文章我会解释。

  • 其他的微队列(other Microtasks Queue) - 包含其他的微队列如成功的 Promise 回调
    考虑下面的代码
Promise.resolve().then(() => console.log('promise1 resolved'));
Promise.resolve().then(() => console.log('promise2 resolved'));
Promise.resolve().then(() => {console.log('promise3 resolved');process.nextTick(() => console.log('next tick inside promise resolve handler'));
});
Promise.resolve().then(() => console.log('promise4 resolved'));
Promise.resolve().then(() => console.log('promise5 resolved'));
setImmediate(() => console.log('set immediate1'));
setImmediate(() => console.log('set immediate2'));process.nextTick(() => console.log('next tick1'));
process.nextTick(() => console.log('next tick2'));
process.nextTick(() => console.log('next tick3'));setTimeout(() => console.log('set timeout'), 0);
setImmediate(() => console.log('set immediate3'));
setImmediate(() => console.log('set immediate4'));
// next tick1
// next tick2
// next tick3
// promise1 resolved
// promise2 resolved
// promise3 resolved
// promise4 resolved
// promise5 resolved
// next tick inside promise resolve handler
// set timeout
// set immediate1
// set immediate2
// set immediate3
// set immediate4

例子

nodejs 中如果执行完IO回调 结束后去执行immediate 队列。
如果

setImmediate(() => console.log('this is set immediate 1'));
setImmediate(() => console.log('this is set immediate 2'));
setImmediate(() => console.log('this is set immediate 3'));setTimeout(() => console.log('this is set timeout 1'), 0);
setTimeout(() => {console.log('this is set timeout 2');process.nextTick(() => console.log('this is process.nextTick added inside setTimeout'));
}, 0);
setTimeout(() => console.log('this is set timeout 3'), 0);
setTimeout(() => console.log('this is set timeout 4'), 0);
setTimeout(() => console.log('this is set timeout 5'), 0);process.nextTick(() => console.log('this is process.nextTick 1'));
process.nextTick(() => {process.nextTick(console.log.bind(console, 'this is the inner next tick inside next tick'));
});
process.nextTick(() => console.log('this is process.nextTick 2'));
process.nextTick(() => console.log('this is process.nextTick 3'));
process.nextTick(() => console.log('this is process.nextTick 4'));
// this is process.nextTick 1
// this is process.nextTick 2
// this is process.nextTick 3
// this is process.nextTick 4
// this is the inner next tick inside next tick
// this is set timeout 1
// this is set timeout 2
// this is set timeout 3
// this is set timeout 4
// this is set timeout 5
// this is process.nextTick added inside setTimeout
// this is set immediate 1
// this is set immediate 2
// this is set immediate 3
  • 当事件循环开始的时候,它会注意到 nextTick 队列,然后开始处理 nextTick 队列。在第二个 nextTick 执行期间,一个新的 nextTick 被添加到 nextTick 队列末尾,将会在队列的结束的时候执行。
  • timer 队列里过期的回调将会被执行。在第二个 timer 回调执行期间,一个 nextTick 被添加到 nextTick 队列。
  • 一旦所有的过期 timer 回调执行完毕,事件循环将会在 nextTick 队列中发现有一个事件回调(在第二个 timer 回调执行期间添加的)。然后事件循环执行它。
  • 因为没有需要处理 I/O 事件,且immediate 还有要处理的回调。因此,事件循环会移到 immediates 阶段,并且会处理 immediate 队列里面的回调。

nodejs 事件轮训相关推荐

  1. nodeJS 事件绑定

    nodeJS事件模块格式 // 引入 events 模块 var events = require('events'); // 创建 eventEmitter 对象 var eventEmitter ...

  2. nodejs 事件循环机制

    nodejs事件循环机制 nodejs是基于v8引擎的JavaScript运行时.(注意nodejs不是一门新的编程语言) nodejs是基于libuv实现 异步非阻塞式i/o 操作的.而事件循环是n ...

  3. Nodejs事件循环

    事件循环 Javascript是单线程的,但是nodejs通过事件循环的方式实现了非阻塞的IO. Javascript主线程通过将发起的IO操作封装请求对象传递给IO线程池,主线程继续完成自己接下来的 ...

  4. nodejs事件和事件循环简介

    文章目录 简介 事件 事件循环 事件循环的阻塞 事件循环举例 栈和消息队列 作业队列和promise process.nextTick() setImmediate() setInterval() 简 ...

  5. 剖析nodejs的事件循环

    本文首发在github,感兴趣请点击此处 nodejs是单线程执行的,同时它又是基于事件驱动的非阻塞IO编程模型.这就使得我们不用等待异步操作结果返回,就可以继续往下执行代码.当异步事件触发之后,就会 ...

  6. (第一次)NODEJS学习笔记

    回调函数 事件循环 读文件 events.Emitter I:nodejs异步的实现 noddJs的异步编程就体现在回调函数上,node.js的所有api都支持回调函数. 通过回调函数可以实现异步化, ...

  7. hook 循环点击事件用哪个_JS 事件循环 event loop,看完你可以答对 90% 的事件循环题...

    本文不保证能说明透彻,因为它本来就存在着混乱,但力求讲到点子上. 比较下面这几个的执行顺序setTimeout setInterval setImmediate (nodejs 支持, new Pro ...

  8. nodejs 前端 返回数组给_互联网寒冬,一年经验字节跳动、虾皮、快手、拼多多前端面试总结...

    △ 是新朋友吗?记得先点web前端学习圈关注我哦- 题主2019年非985/211非计算机专业本科毕业(野生程序员),之前在腾讯实习了半年多+毕业后在腾讯工作了一年,一直都是前端开发. 年中的时候因个 ...

  9. NodeJs 面试题 2023

    (要知道对好事的称颂过于夸大,也会招来人们的反感轻蔑和嫉妒.--培根) ㅤㅤㅤ ㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ NodeJs相关 什么是NodeJs Nodejs是一个基于V8虚拟机的Jav ...

最新文章

  1. 深度研究自然梯度优化,从入门到放弃 | Deep Reading
  2. 多 LDAP 目录服务器的 FileNet P8 系统介绍和配置实例
  3. 有没有插件_这 10 款插件让你的 GitHub 更好用、更有趣
  4. 【不同的子序列问题】面试官写个字符串要我求有多少个“bigsai“,我懵了
  5. 【企业管理】怎么把战略和规划转化为实际行动
  6. Ubuntu 13.04 双显卡安装NVIDIA GT 630M驱动
  7. JAVA程序员--壁纸
  8. 你理解的智能家居就是智能家居么?
  9. 佳能尼康宾得等,说说查看各大单反品牌的快门次数方法
  10. Android开发艺术探索 第一章 Activity的生命周期和启动模式
  11. 小米游戏本 七代 deepin 网卡ac 8265 wifi 驱动 安装
  12. BeeconX路由器是什么牌子?BeeconX路由器怎么样?
  13. 堆——以洛谷p3378,p1334,p1628,p1878为例
  14. IPV6、环回地址(loopback address)
  15. 很久以前的一篇对初学Oracle建议的文章
  16. Linux远程连接服务器
  17. RESCAL 论文笔记
  18. iPhone 5 创建应用程序
  19. 为教育工作者精选的8款堪称「神器」的软件,快看过来
  20. CAT ----分布式实时监控系统

热门文章

  1. 电子计算机的基本结构基于存储程序思想是由,计算机应用基础复习题
  2. 计算机自带的游戏怎么删除吗,电脑自带游戏删除后怎么恢复
  3. 【Unity】AssetBundle简单的加密解密
  4. LD衰减图解读(LD decay)
  5. 树莓派安装python3.6_树莓派 Miniconda 无法安装最新 Python3.6
  6. springboot-滑块验证码
  7. png格式和jpg格式的文件的区别 ?
  8. 微信小程序_石头剪刀布
  9. 6.复杂网络实验六:SIR病毒传播模型(matlab)
  10. 拆书:麦肯锡结构化战略思维:如何想清楚、说明白、做到位