异步任务需要适当的管理。为此,ECMA 标准规定了一个内部队列 PromiseJobs,通常被称为“微任务队列(microtask queue)”(ES8 术语)。
    规范 中所述:

    • 队列(queue)是先进先出的:首先进入队列的任务会首先运行。
    • 只有在 JavaScript 引擎中没有其它任务在运行时,才开始执行任务队列中的任务。

    或者,简单地说,当一个 promise 准备就绪时,它的 .then/catch/finally 处理程序(handler)就会被放入队列中:但是它们不会立即被执行。当 JavaScript 引擎执行完当前的代码,它会从队列中获取任务并执行它。

    1. let promise = Promise.resolve();
    2. promise.then(() => alert("promise done!"));
    3. alert("code finished"); // 这个 alert 先显示

    如果我们需要确保一段代码在 .then/catch/finally 之后被执行,我们可以将它添加到链式调用的 .then 中。

    1. Promise.resolve()
    2. .then(() => alert("promise done!"))
    3. .then(() => alert("code finished"));