JS 事件循环简易伪代码

497 阅读1分钟
class EventLoop {
    constructor() {
        this.taskQueue = []
    }
    add(task) {
        this.taskQueue.push(task)
    }
    sleep(d) {
        return new Promise(resolve => setTimeout(resolve, d))
    }
    async run() {

        while (true) {
            const task = this.taskQueue.shift()

            await this.sleep(task.time)

            this.execScript(task.code) // 执行脚本代码
            this.invokeFunction(task,func) // 调用函数
            // ... 等

        }
    }
}

const eventLoop = new EventLoop()

const macroTaskSet = new Set()

// 收集宏任务到队列 三类:JS代码片段、setTimeout等浏览器API产生、Script / Module
macroTaskSet.add({ time: 1000, code: "let a = 10", func: f })

// 收集宏任务 加入事件队列中
for (const macroTask of macroTaskSet) {
    eventLoop.add(macroTask)
}

// 启动事件循环
eventLoop.run()