【问题标题】:What are standard JS practices about when it's OK *not* to await for an async task?关于什么时候可以*不*等待异步任务的标准 JS 实践是什么?
【发布时间】:2020-10-26 22:18:30
【问题描述】:

来自 python 异步背景,在 python 中,始终跟踪异步任务(承诺)非常重要。运行时会为没有引用的“浮动”异步任务提供错误。但是,在 Javascript 中,在某些情况下,启动一个异步任务而不等待它,甚至不记住它的 Promise 似乎是完全可以的,例如,如果你不关心它的返回值,只是希望它“稍后”执行.

是否有关于何时在浏览器或 node.js 中的 JS/TS 中的指南或最佳实践,只让异步任务执行而不保留对它的引用是可以接受的?显然,如果您关心它在主线代码中的返回值,您必须等待它,同样,如果您关心在主函数完成之前报告错误。还有哪些案例和注意事项?

需要明确的是,我不是在询问意见,而是在询问在“触发和忘记”异步任务时要记住哪些重要事项(如果这是正确的术语)。

【问题讨论】:

  • 当你不关心任务的结果时,在 JavaScript 中不等待异步任务是可以的,后续代码不依赖于异步任务已经完成(成功与否) .但是,您应该始终确保处理错误。

标签: javascript node.js typescript async-await es6-promise


【解决方案1】:

我想我最关心的问题是,你们有处理错误的机制吗?

eslint 有一个 no-floating-promises 规则,它至少会强制你添加一个 .catch(),我认为这很好。

【讨论】:

  • 我猜这个问题被关闭为“基于意见”,但我真的在问最佳实践。 @T.J.Crowder 的答案正是我想要的。让我看看我是否可以重新制定它。
  • 大多数好问题都是基于意见的:(。这是一个糟糕的规则
【解决方案2】:

是否以及何时执行这将是一个见仁见智的问题,因此这部分对于 Stack Overflow 来说是题外话。

但具体的问题是:如果你这样做了,你需要采取什么预防措施吗?答案是:是的。您需要捕获和处理错误。

考虑一下这个返回承诺的即发即弃异步调用:

doSomethingAsync();

如果正在做的事情可能失败,则该承诺可能会被拒绝。如果它被拒绝并且没有处理该拒绝,那么:

  • 在浏览器中,您会收到写入浏览器控制台的错误。 99.9999999% 的用户不会注意到。
  • 在 Node.js 中,您会将此错误写入控制台:

(node:26477) [DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

注意警告:在某些时候,Node.js 的未来版本可能会在您允许未处理的 Promise 拒绝时开始 *终止进程

因此,如果您一劳永逸,请务必捕捉错误,即使您只是默默地吞下它们:

doSomethingAsync().catch(error => {}); // Obviously only do this if you really don't
                                       // care about the error!

有趣的旁注:在 JavaScript 中,您一直在处理未处理的承诺履行。考虑:

doSomethingAsync()
.then(result => {
    // ...do something with result...
})
.catch(error => {
    // ...handle/report the error...
});

所有的承诺都在那里处理了吗?

没有。这很好。

记住thencatch 创建并返回一个promise。上面catch 返回的承诺没有附加任何处理程序。没关系,只要它永远被满足,而不是被拒绝。没有任何东西可以满足这种满足感。 :-)

【讨论】:

  • 作为OP,我会说这个答案非常有用。
猜你喜欢
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多