在node-js事件循环中,微任务在哪里执行?它的各个阶段的优先级如何



这是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事件循环中哪个阶段的优先级高于哪个阶段?

;"优先级";。如图所示,它们一个接一个地重复执行,总是以相同的顺序执行,令人恶心。有些阶段对一次执行的任务数量有限制,以防止其他阶段的任务不足,然后在下一次轮到该阶段时,只运行剩余的任务。

最新更新