我的网站开发技术经验总结 我的网站开发技术经验总结
首页

fangdown

我的网站开发技术经验总结
首页
  • 大前端

    • nodejs

      • nodejs有哪些全局对象,怎么用
      • 如何在nodejs中实现分页机制功能
      • 如何在nodejs实现文件上传功能
      • 如何实现nodejs鉴权机制,说一下思路
      • 说说nodejs中require的原理
      • 说说nodejs中的EventEmit是如何实现的
      • 说说nodejs中的事件循环机制理解
        • 是什么
        • 怎么用
          • 六个阶段
          • process.nextTick
          • 宏微任务
        • 原理
        • FAQ
      • 说说nodejs中进程通信有哪些方式
      • 说说nodejs中间件是什么,如何封装一个中间件
      • 说说对buffer的理解及应用场景
      • 说说对fs模块的理解及常用方法
      • 说说对nodejs的理解及应用场景
      • 说说对process的理解及常用方法
      • 说说对stream的理解及应用场景
      • nodejs如何进行性能监控及优化
      • nodejs批量改文件名
    • git

    • CI

    • 小程序

    • docker

    • Typescript

    • webpack

    • 安全

  • 基础

  • 框架

  • 情商

  • 算法

  • 网络

  • 千锤百炼
  • 大前端
  • nodejs
fangdown
2021-08-13
目录

说说nodejs中的事件循环机制理解

# 是什么

事件循环: nodejs中异步队列里事件执行的机制,同浏览器的事件循环机制

基于libuv(多平台I/O库)实现

# 怎么用

# 六个阶段

记忆:tiipcc

  • timer 执行setTimeout/setInterval的回调
  • i/o 执行上一轮循环中未被执行的i/o回调
  • idle 闲置阶段,系统内部调用
  • poll 检查新的i/o事件,执行i/o回调
  • check 检查阶段,setImmediate()回调函数在此执行
  • close callback 一些关闭的回调函数, 如socket.on('close')

每个阶段对应一个队列,当事件循环进入某个阶段时,将会在该阶段内执行回调,直到队列清空或者回调的最大值已经执行, 那么会进入到下一个阶段

# process.nextTick

插队者:不属于上述的任一阶段,是上一段进入下一段都会执行的一个特殊过渡

# 宏微任务

  • 宏任务:setTimeout/setInterval/setImmediate/io事件/close事件
  • 微任务: process.nextTick/Promise.then回调

执行过程,从上到下执行, 同步任务执行,异步任务根据类型放到分别的阶段, 等待同步任务执行完后--> nextTick--> 微任务 --> 宏任务

# 原理

# FAQ

async function async1() {
    console.log('async1 start')
    await async2()
    console.log('async1 end')
}
async function async2() {
    console.log('async2')
}
console.log('script start')
setTimeout(function () {
    console.log('setTimeout0')
}, 0)
setTimeout(function () {
    console.log('setTimeout2')
}, 300)
setImmediate(() => console.log('setImmediate'));
process.nextTick(() => console.log('nextTick1'));
async1();
process.nextTick(() => console.log('nextTick2'));
new Promise(function (resolve) {
    console.log('promise1')
    resolve();
    console.log('promise2')
}).then(function () {
    console.log('promise3')
})
console.log('script end')
点击查看

分析过程:

先找到同步任务,输出script start

遇到第一个 setTimeout,将里面的回调函数放到 timer 队列中

遇到第二个 setTimeout,300ms后将里面的回调函数放到 timer 队列中

遇到第一个setImmediate,将里面的回调函数放到 check 队列中

遇到第一个 nextTick,将其里面的回调函数放到本轮同步任务执行完毕后执行

执行 async1函数,输出 async1 start

执行 async2 函数,输出 async2,async2 后面的输出 async1 end进入微任务,等待下一轮的事件循环

遇到第二个,将其里面的回调函数放到本轮同步任务执行完毕后执行

遇到 new Promise,执行里面的立即执行函数,输出 promise1、promise2

then里面的回调函数进入微任务队列

遇到同步任务,输出 script end

执行下一轮回到函数,先依次输出 nextTick 的函数,分别是 nextTick1、nextTick2

然后执行微任务队列,依次输出 async1 end、promise3

执行timer 队列,依次输出 setTimeout0

接着执行 check 队列,依次输出 setImmediate

300ms后,timer 队列存在任务,执行输出 setTimeout2


script start async1 start async2 promise1 promise2 script end nextTick1 nextTick2 async1 end promise3 setTimeout0 setImmediate setTimeout2

#nodejs
上次更新: 2021/12/19, 18:05:42
说说nodejs中的EventEmit是如何实现的
说说nodejs中进程通信有哪些方式

← 说说nodejs中的EventEmit是如何实现的 说说nodejs中进程通信有哪些方式→

最近更新
01
多分支修复撞车的问题
05-01
02
如何成为架构师
01-23
03
服务器部署全过程
11-23
更多文章>
Theme by Vdoing | Copyright © 2019-2026 fangdown | 粤ICP备19079809号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式