【问题标题】:Promise returned in function argument where a void return was expected在预期返回 void 的函数参数中返回 Promise
【发布时间】:2020-12-08 18:58:47
【问题描述】:

我正在开发一个 Electron 应用程序,我想在我的 Main 中的匿名函数中使用 async await,如下所示:

process.on("uncaughtException", async (error: Error) => {
  await this.errorHandler(error);
});

但这会产生 Typescript 错误

在返回 void 的函数参数中返回 Promise 预计。

我正在使用 Typescript 3.9.7 和 Electron 9.2.0。

为什么它不允许我使用 async/await?

【问题讨论】:

  • 一个async函数always返回一个promise,所以它不能被传递到需要一个void函数的地方。为什么不直接调用错误处理程序,你还在等什么?
  • 一般来说,不要将async 函数传递给不会使用它们返回的承诺的东西。 TypeScript 正在帮助您避免出现此错误。

标签: javascript typescript electron


【解决方案1】:

您可以在回调中使用异步IIFE,如下所示:

process.on("uncaughtException", (error: Error) => {
  (async () => {
    await this.errorHandler(error);

    // ...
  })();
});

这确保了回调的隐式返回仍然是undefined,而不是一个承诺。

【讨论】:

  • 请务必正确处理承诺拒绝。
  • 除了消除 eslint 错误之外,是否有充分的理由这样做?
  • @Henrique Bruno 在功能上,没有。从语义上讲,是的——它清楚地表明这是一个“即发即弃”操作,并且回调本身并没有对异步代码做任何特殊的事情(不等待它或对结果做任何事情)。
  • @LionelRowe 简单且思维扩展的答案。谢谢!但是,我将禁用此 ESLint 规则,因为我认为启用它会为我的使用增加不必要的复杂性和冗长级别。
【解决方案2】:

您可以在checksVoidReturn option 的帮助下关闭此检查(不是整个规则):

.eslinter.js

rules: {
    {
      "@typescript-eslint/no-misused-promises": [
        "error",
        {
          "checksVoidReturn": false
        }
      ]
    }
}

但我强烈建议不要这样做,并使用 .then.catch 重写您的代码以避免遇到此 linter 错误。

您也可以禁用此规则,并在此特定事件上方添加 // eslint-disable-next-line @typescript-eslint/no-misused-promises 注释以及几行说明您认为可以忽略该错误的原因的注释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-28
    • 2017-07-13
    • 2018-11-03
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2018-12-05
    相关资源
    最近更新 更多