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

Posted

技术标签:

【中文标题】ESLint 可以帮助你防止 Unhandled-Promise-Rejections 吗?【英文标题】:Can ESLint help you prevent Unhandled-Promise-Rejections? 【发布时间】:2020-11-14 01:41:02 【问题描述】:

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

不推荐使用未处理的承诺拒绝。未来,承诺 未处理的拒绝将终止 Node.js 进程 具有非零退出代码。 - DEP0018

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

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

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

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

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

【问题讨论】:

这应该可以帮助你npmjs.com/package/eslint-plugin-promise,看看catch-or-return,恕我直言,这将进一步增加MOPnGLOW @m90 MOPnGLOW 是什么意思? @Jhecht 实际上叫做mop&glow。它是一种使地板发光的产品。 啊...是的...这很...有意义仍然非常困惑,但正确 @Jhecht 这对我来说是一个不好的类比;我没能变得丰富多彩。 【参考方案1】:

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

【讨论】:

这应该被标记为最新的、最好的答案。到今天为止,eslint-plugin-promise 已经两年没有发布了,而typescript-eslint 是 typescript ESLint 的标准插件,它的最新版本是两天前发布的 @ppicom 仅根据软件包的发布来判断某些东西并不总是有多大价值。如果没有要修复的错误并且没有适用的新功能,则高度集中的软件包通常不需要更新。此外,您的比较是针对专注于语言承诺功能的插件与支持整个语言的插件。 @DannyHurlburt 我不太明白您要表达的意思。当 linter 已经支持该功能时,为什么还要安装另一个插件?此外,最新版本有时是维护者活跃程度的一个指标,并且可以粗略地了解一个包是否得到维护。话虽如此,eslint-plugin-promise 已发布,所以我之前的评论 50% 无效:)【参考方案2】:

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)

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

我已经在大量使用 async/await。但是,每个异步函数调用都会返回一个 promise,并且 'try/catch' 语法并不比 .catch()=> 好多少;似乎没有 '.catch()=>' 足以清楚地表明我不在乎,而不必如此冗长明确。最后,目标是防止服务器因我认为次要的事情而崩溃。 好吧,你可以写一个助手const swallowErrors = (p) => p.catch(e => console.warn(e)),并把你不关心的promise包装在里面,例如。 值得一提的是,PyCharm/WebStorm IDE 为忽略的承诺返回值提供了注释;不确定 ESLint 是否有。 每个调用的常规函数​​也可能是未捕获的异常。 :) 是的,这对我来说是个好主意。也许他们应该像常规函数中的异常一样使您的服务崩溃确实是有道理的,但是对于我来说,通过简单地自动忽略这些未处理的承诺拒绝来稳定运行崩溃的服务对我来说很难。再次,让我思考一个好点......

以上是关于ESLint 可以帮助你防止 Unhandled-Promise-Rejections 吗?的主要内容,如果未能解决你的问题,请参考以下文章

防止 Prettier(代码格式化程序)和 ESLint/TSLint 之间的冲突

使用 ESLint 防止在 IE11 中使用不支持的 JavaScript 功能?

打造自定义 eslint

忽略或防止 ESLint 错误破坏 React 项目中的构建 (create-react-project)

Rust 语言如何帮助你防止 bug

Eslint/Tslint 配置帮助(不包括文件)