简单来说,async函数是 promise 的 "语法糖"。它们允许我们使用更熟悉的语法来模拟同步执行,从而代替 promise 链式写法。

// Promise Chain
Promise.resolve('Presto')
  .then(handler1)
  .then(handler2)
  .then(console.log);

// `async`/`await` Syntax
async function run({
  const result1 = await handler1('Presto');
  const result2 = await handler2(result1);
  console.log(result2);
}

然而和 promise 一样,async 函数也不是 "免费" 的。async关键字隐含初始化了几个Promise 【说明1】,以便最终在函数体中调用 await关键字的函数。

说明1: 在旧版本的ECMAScript规范中,最初要求JavaScript引擎为每个async函数构造至少三个Promise。反过来,这意味着“微任务队列”中至少还需要三个“微任务”来 resolve 一个 async 函数 -更不用说执行过程中的加入的promise了。这样做是为了确保 await 关键字正确地模拟Promise#then的行为,同时仍保持“暂停的函数”的语义。毫无疑问,与简单的promise 相比,这带来了显着的性能开销。