当前位置:首页 > JavaScript

eventloop js实现

2026-04-06 22:22:23JavaScript

Event Loop 的基本概念

Event Loop 是 JavaScript 处理异步任务的核心机制,它通过任务队列和调用栈的协作实现非阻塞执行。其核心分为宏任务(macrotask)和微任务(microtask),执行顺序遵循“一个宏任务 → 所有微任务”的循环。

宏任务与微任务

宏任务包括:

  • setTimeoutsetInterval
  • I/O 操作(如文件读取)
  • UI 渲染
  • setImmediate(Node.js)

微任务包括:

  • Promise.thenPromise.catch
  • MutationObserver
  • process.nextTick(Node.js,优先级高于其他微任务)

简单 Event Loop 实现示例

以下是一个简化版的 Event Loop 模拟代码,展示如何调度宏任务和微任务:

class EventLoop {
  constructor() {
    this.macroTaskQueue = []; // 宏任务队列
    this.microTaskQueue = []; // 微任务队列
    this.isRunning = false;
  }

  // 添加宏任务
  addMacroTask(task) {
    this.macroTaskQueue.push(task);
    this.runLoop();
  }

  // 添加微任务
  addMicroTask(task) {
    this.microTaskQueue.push(task);
    this.runLoop();
  }

  // 执行事件循环
  runLoop() {
    if (this.isRunning) return;
    this.isRunning = true;

    while (true) {
      // 执行所有微任务
      while (this.microTaskQueue.length > 0) {
        const task = this.microTaskQueue.shift();
        task();
      }

      // 执行一个宏任务
      if (this.macroTaskQueue.length > 0) {
        const task = this.macroTaskQueue.shift();
        task();
      } else {
        break; // 队列为空时退出
      }
    }

    this.isRunning = false;
  }
}

// 使用示例
const loop = new EventLoop();

loop.addMacroTask(() => console.log("宏任务 1"));
loop.addMicroTask(() => console.log("微任务 1"));
loop.addMacroTask(() => console.log("宏任务 2"));
loop.addMicroTask(() => console.log("微任务 2"));

// 输出顺序:
// 宏任务 1
// 微任务 1
// 微任务 2
// 宏任务 2

Node.js 与浏览器的差异

  1. Node.js

    • process.nextTick 的优先级高于 Promise
    • setImmediate 在 I/O 阶段后执行,setTimeout 在定时器阶段执行。
  2. 浏览器

    eventloop js实现

    • requestAnimationFrame 是特殊的宏任务,在渲染前执行。
    • 微任务执行时机可能在渲染之前或之后,取决于浏览器实现。

实际应用注意事项

  • 避免阻塞微任务队列:长时间运行的微任务会延迟渲染和后续任务。
  • 宏任务的拆分:对于耗时操作,使用 setTimeoutrequestIdleCallback 分片执行。
  • 优先级控制:在 Node.js 中,高优先级任务用 process.nextTick,普通异步用 Promise

通过理解 Event Loop 的调度机制,可以优化代码性能并避免常见的异步陷阱。

标签: eventloopjs
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callback) {…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…