异步任务需要适当的管理。为此,ECMA 标准规定了一个内部队列 PromiseJobs
,通常被称为“微任务队列(microtask queue)”(ES8 术语)。
如 规范 中所述:
- 队列(queue)是先进先出的:首先进入队列的任务会首先运行。
- 只有在 JavaScript 引擎中没有其它任务在运行时,才开始执行任务队列中的任务。
或者,简单地说,当一个 promise 准备就绪时,它的 .then/catch/finally
处理程序(handler)就会被放入队列中:但是它们不会立即被执行。当 JavaScript 引擎执行完当前的代码,它会从队列中获取任务并执行它。
let promise = Promise.resolve();
promise.then(() => alert("promise done!"));
alert("code finished"); // 这个 alert 先显示
如果我们需要确保一段代码在 .then/catch/finally
之后被执行,我们可以将它添加到链式调用的 .then
中。
Promise.resolve()
.then(() => alert("promise done!"))
.then(() => alert("code finished"));