EventLoop
之所以称之为 事件循环,是因为它经常按照类似如下的方式来被实现:
while (queue.waitForMessage()) {
queue.processNextMessage();
}
queue.waitForMessage()
会同步地等待消息到达(如果当前没有任何消息等待被处理)。
一个 EventLoop 中,可以有一个或多个任务队列。一个任务队列便是一系列有序任务(task)的集合;每个任务都有一个任务源(task source),源自同一个任务源的 task 必须放到同一个任务队列,从不同源来的则被添加到不同队列。
setTimeout
/Promise
等API便是任务源,而进入任务队列的是他们指定的具体执行任务。
任务队列
宏任务 (macro)task
(macro)task主要包含:script(整体代码)、
setTimeout
、setInterval
、I/O、UI交互事件、postMessage
、MessageChannel
、setImmediate
(Node.js 环境)微任务 microtask
microtask主要包含:
Promise.then
、MutaionObserver
、process.nextTick
(Node.js 环境)