为了账号安全,请及时绑定邮箱和手机立即绑定

关于什么时候可以*不*等待异步任务的标准 JS 实践是什么?

关于什么时候可以*不*等待异步任务的标准 JS 实践是什么?

Qyouu 2022-11-03 10:32:53
来自 python 异步背景,在 python 中,始终跟踪异步任务(承诺)非常重要。运行时会为没有引用的“浮动”异步任务提供错误。但是,在 Javascript 中,在某些情况下,只启动一个异步任务而不等待它,甚至不记住它的 Promise 似乎是完全可以的,例如,如果你不关心它的返回值,只是希望它“稍后”执行.是否有关于何时在浏览器或 node.js 中的 JS/TS 中的指南或最佳实践,只让异步任务离开而不保留对它的引用是可以接受的?显然,如果您关心它在主线代码中的返回值,您必须等待它,同样,如果您关心在 main 函数完成之前报告错误。还有哪些其他情况和注意事项?需要明确的是,我不是在询问意见,而是在询问“触发和忘记”异步任务时要记住的重要事项(如果这是正确的术语)。
查看完整描述

2 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

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


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


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


doSomethingAsync();

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


在浏览器中,您会收到写入浏览器控制台的错误。99.9999999% 的用户不会注意到。

在 Node.js 中,您会将此错误写入控制台:

(节点: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...

});

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


不,那很好。


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


查看完整回答
反对 回复 2022-11-03
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

我想我普遍关心的是,你有处理错误的机制吗?

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


查看完整回答
反对 回复 2022-11-03
  • 2 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信