小编Art*_*nko的帖子

commonJs 和 ESM 中的 process.nextTick 与queueMicrotask。执行顺序是什么?

假设我们有一个包含以下 JS 代码的文件:

process.nextTick(()=>{
    console.log('nextTick')
})

queueMicrotask(()=>{
    console.log('queueMicrotask')
})

console.log('console.log')
Run Code Online (Sandbox Code Playgroud)

我们已经"type": "commonjs"在 package.json 中设置了模块系统

我们期望控制台输出什么?Node.js 官方文档说:

在 Node.js 事件循环的每一轮中,process.nextTick() 队列始终在微任务队列之前处理

所以,在控制台中我们期望

console.log
nextTick
queueMicrotask
Run Code Online (Sandbox Code Playgroud)

那行得通。直到我将模块系统更改为"type": "module". 在那次更改之后,我不断地在 process.nextTick 之前执行queueMicrotask。控制台输出为:

console.log
queueMicrotask
nextTick
Run Code Online (Sandbox Code Playgroud)

有人能解释这种行为吗?我假设这种行为在某种程度上与模块评估和执行过程有关,并且 nextTick queueMicrotask 以某种方式进入不同的事件循环滴答,因为模块意味着异步执行(在浏览器中)。尽管如此,这种猜测还是非常不稳定,从我的角度来看,这是不合逻辑的。尽管如此,我仍然没有一个合理的解释。

javascript event-loop commonjs node.js es6-modules

9
推荐指数
1
解决办法
525
查看次数

标签 统计

commonjs ×1

es6-modules ×1

event-loop ×1

javascript ×1

node.js ×1