代码之家  ›  专栏  ›  技术社区  ›  Adam Thompson

解析的承诺进入任务队列需要多长时间?

  •  1
  • Adam Thompson  · 技术社区  · 6 年前

    我仍在试图找出事件循环,以及什么时候事情会发生/什么时候处理任务队列。

    console.log('start');
    
    Promise.resolve().then(function() {
      console.log('promise');
    });
    
    console.log('end');
    

    这将输出以下结果:

    > "start"
    > "end"
    > "promise"
    

    承诺不应该立即解析吗?这样,调用堆栈就在(打印“end”之前)之后是空的,因此回调将在打印“end”之前作为任务处理吗?

    很明显,我在这里遗漏了关于a)当解析的Promise回调被添加到任务队列时,或者b)当任务在事件循环中处理时。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Benjamin Gruenbaum    6 年前

    使用你使用的术语。只有平台代码在运行时(即所有同步代码都已完成执行时)才会执行任务队列。我们保证您的代码可以按照正确的顺序执行。

    他们跑了 之前 事件循环(它们是“微任务”),这就是为什么 then 在任何 setTimeout 例如。

        2
  •  0
  •   Adam Thompson    6 年前

    问题是,我认为在立即解决承诺之后,堆栈是清晰的,但实际上堆栈是 在那一点上是清楚的。您可以将执行的整个代码块看作 main() a的功能 C 程序使 C类 类比。

    因此,由于堆栈不清楚,即使现在回调队列中的一个微任务正在等待处理,它也不会得到处理,直到主线程中的所有同步JS代码完成。