【问题标题】:How to write async/await in vanilla JS如何在 vanilla JS 中编写 async/await
【发布时间】:2021-01-02 23:11:29
【问题描述】:

在MDN Doc,它说

async function foo() { 
    await 1
}

相当于:

function foo() {
    return Promise.resolve(1).then(() => undefined)
}

那么什么是等价的

async function foo() {
    await genPromise();
}

假设 genPromise() 返回另一个 Promise。

会不会

function foo() {
    return Promise.resolve(new Promise((resolve, reject) => {})).then(() => undefined)
}

【问题讨论】:

  • 是的。有点(虽然你错过了return)。引擎可能会跳过未使用的 Promise 对象的创建。
  • 谢谢!刚刚注意到缺少的回报并添加了它。
  • async/await 是自 ES8 以来的原生 JavaScript。
  • 我想更好的表达方式是如何将 async/await 写为 Promise?

标签: javascript promise async-await


【解决方案1】:

那么什么是等价的

async function foo() {
   await genPromise();
}

该代码将等待 genPromise 返回的 Promise 解析,然后将其自己的 Promise 解析为 undefined。所以等价的是:

function foo() {
  return genPromise().then(() => undefined);
}

【讨论】:

  • 如果genPromise 不会返回一个承诺,你需要一个Promise.resolve(...) 围绕它
  • 如果await值返回一个新的Promise,那么“async”生成的Promise.resolve()就消失了?
  • @apcyang 不是。它用于确定它是否是一个承诺。但是,在这种情况下,JS 引擎可能会跳过创建另一个 Promise 对象,但这不是您应该关心的部分
  • 嗯,好的。所以关键的想法是它会跳过创建未使用的承诺,就像@Jonas Wilms 所说的那样。感谢您的帮助!
  • 请注意,如果getPromise 同步抛出异常,这将不具有等效的错误处理特性
猜你喜欢
  • 2021-07-04
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 2020-02-14
  • 2018-12-04
  • 2017-05-30
相关资源
最近更新 更多