与macrotask和microtask队列的这种描述相混淆。
对于“事件循环”的每个循环,将从宏任务队列中完成一个宏任务。该宏任务完成后,事件循环将访问microtask队列。在继续之前,将完成整个微任务队列。
setTimeout(function() {
console.log('macrotask');
}, 0);
Promise.resolve().then(function() {
console.log('microtask 1');
}).then(function() {
console.log('microtask 2');
});
这段代码不应该首先输出“宏任务”吗?因为setTimeout是在循环进入微任务队列之前完成的宏任务队列的一部分?
发布于 2019-03-16 18:48:18
您的代码运行的任务实际上是一个macrotask。
当完成时(这意味着评估和运行您的代码),事件循环将执行队列中的微任务。这是第一个承诺,但是这个承诺为微任务q添加了另一个承诺,第二个承诺被执行。
清除微任务q后,选择另一个宏任务,并最终执行timeout。
发布于 2019-09-24 12:18:26
在执行任何JS文件时,JS引擎将内容封装在函数中,并将该函数与事件启动或启动关联起来。JS引擎发出开始事件,事件被添加到任务队列(作为宏任务)。
初始化时,JS引擎首先提取宏任务队列中的第一个任务,并执行回调处理程序。因此,我们的代码被运行。
因此,我们看到运行的脚本是第一个排队的macrotask。因此,首先,JSEngine将脚本中的所有同步代码添加为事件循环队列中的macrotask。然后它会看到setTimeout,这是另一个macrotask,因此它被记录在事件循环队列中的一个单独的任务中。然后,它看到了承诺,它是一个microtask,并将其添加到微任务队列中。
微任务队列在回调之后被处理,只要没有其他JavaScript在执行过程中和每个任务的末尾。
在本例中,任务队列的顺序是Script=>Promise1=>Promise2=>setTimeout。
由于脚本中没有同步代码,所以脚本的执行不会打印任何内容。然后引擎执行微任务队列(承诺-1,承诺-2),最后执行宏任务,即setTimeout。

注意:-这是默认行为,在不同的浏览器中可能有所不同。
https://stackoverflow.com/questions/55200324
复制相似问题