超时和承诺功能的执行顺序(主要任务和微任务)

Nen*_*Nen 4 javascript

我正在浏览html5boilerplate github并且我去看了一些面试问题,我遇到了这个问题,我不明白为什么它按照它的顺序输出.我认为它将是一个四二三而不是它的输出.有人可以解释原因吗?对不起,如果太简单了.

问题:以下代码打印什么?

console.log('one');
setTimeout(function() {
  console.log('two');
}, 0);
Promise.resolve().then(function() {
  console.log('three');
})
console.log('four');
Run Code Online (Sandbox Code Playgroud)

输出按此顺序"一""四""三",最后"两"

Nul*_*ter 12

我想输出onefour是相当清楚的。setTimeout主任务队列的一部分,Promise而是微任务队列的一部分,这就是为什么打印“三个”,最后打印“两个”的原因。

逐步执行如下:

  1. 执行脚本时,首先执行console.log(“ one”)

  2. setTimeout(…)遇到,运行时间发起一个计时器,和0毫秒后。回调function() {}setTimeout(…)在任务队列中排队。

  3. 当遇到promise对象时,其回调即function() {}在微型任务队列中排队。

  4. 最后,它执行last console.log(“four”)

根据标准规格

  1. 一旦调用堆栈被清空,它将检查Micro任务队列并找到function() {}promise的回调。调用堆栈将执行它(记录三)

  2. 再一次,在处理Micro任务队列中的回调后,将清空呼叫堆栈。最后,事件循环拿起从任务队列即回调新任务function() {}setTimeout(…) (原木二)执行它。


视觉影像

视觉影像

  • 老兄,你的回答超越了解释这一点,老实说,我真的很感激 (2认同)