【问题标题】:Async/Await vs new Promise(resolve,reject)Async/Await vs new Promise(resolve,reject)
【发布时间】:2019-04-07 23:46:24
【问题描述】:

async/await 和使用.then.finally.catch 的更标准的promise 表示法之间有什么区别

例如

functionThatReturnsPromise(someVar).then((returnedValueFromPromise) => {
    console.log(returnedValueFromPromise)
})

async functionThatReturnsPromise(someVar)  {
    await returnedValueFromPromise
}

我不确定 Promise 链接是否只是旧的表示法,它已被更新的 async/await 取代。两者还有用例吗?什么是更好的做法?

【问题讨论】:

  • async await 在语法上只是 promise 的糖,它使代码看起来更具可读性,尤其是当您有嵌套的 pomise 时,请从类似的问题中查看这个不错的 answer
  • 比较你的例子是没有意义的。一个定义functionTahtReturnsPromise,另一个调用它并使用promise?
  • 回答问题标题“Async/Await vs new Promise(resolve,reject)”:async/await cannot replace new Promise
  • Async/Await 不只是一个在底层使用 Promises(和生成器?)以提高可读性的 API 吗?

标签: javascript promise


【解决方案1】:

这一切都取决于你想要什么。 async/await 是新的。可以这样想,它们允许 Promise 像同步一样运行,而实际上它不是。

此外,使用async/await 可以让您的代码更简洁、更易读。 为了回答您的问题,就他们所做的而言,它们之间没有太大区别。语法完全不同。

Promise 链并不是旧时尚,它们是相当新的,只是 async/await 出现得稍晚一些 - 为您提供了一种“更好”的 Promise 处理方式。

最后,您可以在代码中互换使用它们。

【讨论】:

    【解决方案2】:

    您误解了它的工作原理。使用async/await,您就有了代码执行的同步语法流:

    try {
      const returnedValueFromPromise = await functionThatReturnsPromise(someVar);
    } catch (err) {
      console.error(err);
      throw err
    }
    

    注意

    • 代码块必须在 async 作用域函数内
    • 你仍然需要进行错误处理,不能假设 promise 总是能正常工作
    • async 封闭函数返回的所有值默认都是承诺

    【讨论】:

      【解决方案3】:

      需要注意await,您需要将await 语句包装在try catch block 中,以防请求失败,我个人认为这比常规的promise 链更丑。

      【讨论】:

      • 您不需要将所有内容都包装在try/catch 中,就像您不必在每个承诺上安装.catch() 处理程序一样。你只需要在你想处理错误的地方做,通常是在最后。
      猜你喜欢
      • 2015-11-15
      • 2016-08-04
      • 2019-09-15
      • 2020-12-31
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 2019-09-16
      • 2020-10-06
      相关资源
      最近更新 更多