当前位置:首页 > JavaScript

js实现eventloop

2026-03-14 12:42:07JavaScript

实现 JavaScript Event Loop

JavaScript 的 Event Loop 是其异步编程的核心机制。以下是实现 Event Loop 的关键步骤:

理解 Event Loop 的基本结构

Event Loop 由调用栈(Call Stack)、任务队列(Task Queue)和微任务队列(Microtask Queue)组成。调用栈负责执行同步代码,任务队列存放宏任务(如 setTimeout),微任务队列存放微任务(如 Promise)。

模拟调用栈和队列

创建一个简单的调用栈和队列结构来模拟 Event Loop 的行为:

const callStack = [];
const macroTaskQueue = [];
const microTaskQueue = [];

处理同步代码

同步代码直接推入调用栈并执行:

function executeSyncCode(task) {
    callStack.push(task);
    console.log(`Executing: ${task}`);
    callStack.pop();
}

处理异步代码

异步任务(如 setTimeout)被推入宏任务队列:

function setTimeoutAsync(callback, delay) {
    macroTaskQueue.push(() => {
        setTimeout(() => {
            callStack.push(callback);
            callback();
            callStack.pop();
        }, delay);
    });
}

处理微任务

微任务(如 Promise)被推入微任务队列,并在当前宏任务执行完成后立即执行:

function promiseAsync(callback) {
    microTaskQueue.push(() => {
        Promise.resolve().then(() => {
            callStack.push(callback);
            callback();
            callStack.pop();
        });
    });
}

Event Loop 主循环

实现一个简单的 Event Loop 主循环,优先处理微任务队列,再处理宏任务队列:

function eventLoop() {
    while (microTaskQueue.length > 0) {
        const task = microTaskQueue.shift();
        task();
    }

    if (macroTaskQueue.length > 0) {
        const task = macroTaskQueue.shift();
        task();
    }

    if (callStack.length === 0 && macroTaskQueue.length === 0 && microTaskQueue.length === 0) {
        console.log("Event Loop idle");
        return;
    }

    setTimeout(eventLoop, 0);
}

示例用法

以下代码演示了如何使用上述实现的 Event Loop:

executeSyncCode(() => console.log("Sync Task 1"));

setTimeoutAsync(() => console.log("Macro Task 1"), 1000);
promiseAsync(() => console.log("Micro Task 1"));

executeSyncCode(() => console.log("Sync Task 2"));

eventLoop();

输出顺序

运行上述代码后,输出顺序为:

js实现eventloop

Sync Task 1
Sync Task 2
Micro Task 1
Macro Task 1
Event Loop idle

关键点

  • 微任务队列优先级高于宏任务队列。
  • 每次宏任务执行完成后,会清空微任务队列。
  • setTimeoutPromise 是典型的宏任务和微任务。

通过以上实现,可以清晰地理解 JavaScript Event Loop 的工作机制。

标签: jseventloop
分享给朋友:

相关文章

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现倒计时

js实现倒计时

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

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…

js实现上传文件

js实现上传文件

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。 <input type="file"…