ESLint 可以帮助您防止 Unhandled-Promise-Rejections 吗?

Can ESLint help you prevent Unhandled-Promise-Rejections?

eslint 是否有能力警告防止未处理的承诺拒绝的地方?

Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. - DEP0018

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

不管怎样,我猜其他人已经认为完美比稳健更重要。

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

ESlint 是否提供任何东西来帮助我找到没有捕获的承诺?是否有任何规范补充正在进行中,以解决这种丑陋和不便之处?

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

移植您的代码以使用 async/await 而不是承诺链将有助于开始,并使您的代码再次更漂亮;那里 is a codemod that can help you with that.

Anyway, I guess someone else has already decided that perfection is more important than robustness.

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

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

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

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

Ensure that each time a then() is applied to a promise, a catch() is applied as well. Exceptions are made if you are returning that promise.

有效

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)
}

我想知道为什么没有人提到“typescript-eslint”中的“无浮动承诺”规则,该规则强制使用 async/awaitthen/catch 适当处理所有承诺 — https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-floating-promises.md 或许它应该被称为“No unhandled promises”。 :)