这是Node事件循环。
┌───────────────────────────┐
┌─>│ timers │
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │ pending callbacks │
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │ idle, prepare │
│ └─────────────┬─────────────┘ ┌───────────────┐
│ ┌─────────────┴─────────────┐ │ incoming: │
│ │ poll │<─────┤ connections, │
│ └─────────────┬─────────────┘ │ data, etc. │
│ ┌─────────────┴─────────────┐ └───────────────┘
│ │ check │
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
└──┤ close callbacks │
└───────────────────────────┘
我知道Node使用V8 JS引擎,并且我了解到V8有自己的事件循环,嵌入程序可以自由替换或扩展。例如,在Chrome中,有一个宏任务和一个微任务队列(微任务队列的优先级高于宏任务队列(,一旦主线程的调用堆栈为空,事件循环就会从这些队列推送回调。
您可以使用queueMicrotask
函数手动在微任务队列上对微任务进行排队。
我也尝试过在Node中使用这个函数,它很有效我的问题是,在事件循环中排队的微任务在哪里?他们在哪个阶段排队?他们是否有一个特定的阶段,或者他们是否与其他类型的回调混合在一起?
我尝试了这个代码来了解Node事件循环中具有优先级的内容:
const hello_world =() => {
console.log("Hello World 2");
};
queueMicrotask(hello_world);
setTimeout(
() => {
console.log("Hello World 3");
},
0
);
console.log("Hello World 1");
/*
OUTPUT:
Hello World 1
Hello World 2
Hello World 3
*/
因此,我可以看到微任务的优先级高于定时器(在chrome事件循环中被视为宏任务(,但节点中事件循环中的微任务队列在哪里?
此外,在Node事件循环中,什么比什么具有优先级例如,我知道在Chrome中,微任务队列的优先级高于宏任务队列,但在Node事件循环中,哪个阶段的优先级高于哪个阶段?
Node中事件循环中的微任务队列在哪里?
它们可以在任何地方排队-你可能想问它们在哪里排队:-(
你读过的文章回答了这个问题:
在处理宏任务队列中的一个宏任务后,事件循环应完全处理微任务队列。[…]但在v11.0.0之前的NodeJS版本中,微任务队列仅在事件循环的每两个阶段之间耗尽。
所有那些";相位";图中用于处理宏任务:计时器、挂起任务、轮询事件、即时事件、关闭事件。微任务在每个宏任务之后执行,就像在浏览器中一样。
唯一的异常异常是process.nextTick
的特殊情况,它也不将宏任务排入队列。这篇文章区分了";promises微任务队列";和一个";nextTick
微任务队列"-总体术语";微任务";用于下一个宏任务之前的所有内容。
Node事件循环中哪个阶段的优先级高于哪个阶段?
;"优先级";。如图所示,它们一个接一个地重复执行,总是以相同的顺序执行,令人恶心。有些阶段对一次执行的任务数量有限制,以防止其他阶段的任务不足,然后在下一次轮到该阶段时,只运行剩余的任务。