6

eslint 是否有能力警告地方以防止 Unhandled-Promise-Rejections?

未处理的承诺拒绝已被弃用。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。- DEP0018

你知道吗,我有点喜欢引擎当前如何处理 Unhandled-Promise-Rejections;因为当您有 Unhandled-Promise-Rejection 时,不是整个服务崩溃,而是服务继续运行,并且只有依赖于错误承诺实例的部分无法完成。假设错误是由程序员在验证期间未预料到的一些用户输入引起的。有异常的异步函数继续存在以服务其他调用(那些没有相同的意外用户输入的调用)。是的,此时程序中有垃圾,以永远等待的形式永远不会解决,但对我来说,这比让服务完全崩溃更强大。

无论如何,我想其他人已经决定完美比稳健更重要。

因此,现在是时候让我的代码变得丑陋和完美了,.catch(()=>{});在我的代码中所有那些之前看起来像 MOP&GLOW 一样干净的等待之后不久就进行了附加。

ESlint 是否提供任何东西来帮助我找到没有捕获的承诺?是否有任何正在添加的规范来解决这种丑陋和不便?

就个人而言,我希望我可以将引擎配置为仅终止来自 UnhandledPromiseRejection 的承诺链中的代码。我当然想更容易地解决这个问题,而不是将所有这些添加.catch(()=>{})到我等待的所有异步函数调用中。

4

3 回答 3

11

我想知道为什么没有人提到“typescript-eslint”中的“No floating promises”规则,它强制所有的 promises 要么用async/awaitthen/catch- https://github.com/typescript-eslint/typescript-eslint/blob/ master/packages/eslint-plugin/docs/rules/no-floating-promises.md 应该叫“No unhandled promises”。:)

于 2020-10-09T16:20:58.690 回答
6

ESLint 本身并没有你想要的功能,但是有一个非常流行的插件叫做eslint-plugin-promise

具体来说,catch-or-return规则可以满足您的要求:

确保每次将 then() 应用于 promise 时,也会应用 catch()。如果您返回该承诺,则例外。

有效的

myPromise.then(doSomething).catch(errors)
myPromise
  .then(doSomething)
  .then(doSomethingElse)
  .catch(errors)
function doSomethingElse() {
  return myPromise.then(doSomething)
}

无效的

myPromise.then(doSomething)
myPromise.then(doSomething, catchErrors) // catch() may be a little better
function doSomethingElse() {
  return myPromise.then(doSomething)
}
于 2020-07-25T13:56:42.500 回答
2

将您的代码移植到使用async/await而不是 Promise 链将有助于开始,并使您的代码再次更漂亮;有一个 codemod 可以帮助你

无论如何,我想其他人已经决定完美比稳健更重要。

如果您问我,新行为更合理(尤其是在使用async/时await, where.catch(() => ...)只是通常的catch (e) { ... },而不是捕获异常,嗯...)

如果您确实使用.then()语法,则向.catch(() => {})读者添加信号,表明您明确不关心发生的任何错误。

于 2020-07-24T08:33:58.657 回答