【问题标题】:typescript awaiting an async function that returns a Promise<void>打字稿等待返回 Promise<void> 的异步函数
【发布时间】:2021-08-24 03:25:41
【问题描述】:
Method() {
    // simulating a method of a third-party library that returns Promise<void>
    return new Promise(() => {
      // some time-consuming operations
    }).then(() => console.log('end'))
  }

在调用不返回任何数据的异步方法时,我们是否必须使用 await 关键字?

await this.Method().then(() => console.log('done'))
// or
this.Method().then(() => console.log('done'))

对于本例,是否保证在两种情况下(使用和不使用await 关键字)控制台打印“done”之前,Method() 内的所有操作都已完成?

【问题讨论】:

  • 你为什么要把asyncnew Promise()混在一起?如果你return new Promise(...),这可能会达到你的预期,你不需要将Method定义为async
  • 这是返回 promise 的方法示例,例如更新或删除 firebase 实时数据库中的数据。使用异步或返回新的promise都返回promise,我的问题是我们是否必须等待一个返回promise的方法

标签: javascript typescript asynchronous async-await promise


【解决方案1】:

您可以简单地执行以下操作:

caller = await this.Method().then(() => console.log('done'))

或者,如果您不需要使用结果

caller = this.Method()

【讨论】:

  • 所以你确定简单调用 this.Method() 保证 Method() 中的所有操作在控制台打印“完成”之前完成?
  • 'await' 表达式只允许在异步函数中和 modules.ts(1308) 的顶层使用。所以 caller = async() => await ... 是正确的
  • 编程中从来没有任何东西的受赠者。您无需使用 asnyc lambda 函数来调用已标记为异步的方法。您在 Method 中的方法是异步的,因此您无需将其包装在异步 lambda 中即可等待它,您只需等待它即可。这假设父函数是 asnyc ,如果不是,即使这是你唯一等待的东西,你也应该这样做。如果您不需要等待它,因为您不关心结果,那么您不需要等待它,因为它已经是异步的。
  • 如果我想在完成该承诺后执行一些代码怎么办?
  • 那么你需要等待它并使用你的 .then ,就像我在我的第一个代码示例中展示的那样。这就是它的设计工作方式,再次假设您的父函数是异步的。
【解决方案2】:

是否保证Method()内的所有操作在.then()回调打印“完成”之前完成

是的,通过使用.then() methodawait 关键字在这里无关紧要。做事的时候很重要

await this.Method();
console.log('done');

(你probably should)。

在调用不返回任何数据的异步方法时,我们是否必须使用 await 关键字?

是的,因为它们可能仍然会抛出错误,并且即使您不关心返回值,您也希望等待完成。更多讨论请参见Can I fire and forget a promise in nodejs (ES7)?

【讨论】:

    猜你喜欢
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 2019-02-06
    • 2019-08-02
    • 1970-01-01
    • 2017-02-10
    相关资源
    最近更新 更多