关于什么时候可以*不*等待异步任务的标准 JS 实践是什么?
What are standard JS practices about when it's OK *not* to await for an async task?
来自 python 异步背景,在 python 中,始终跟踪异步任务(承诺)非常重要。运行时为没有引用的“浮动”异步任务提供错误。但是,在 Javascript 中,在某些情况下,只启动异步任务而不等待它甚至记住它的 Promise 似乎完全可以,例如,如果你不关心它的 return 值而只是希望它“稍后”执行。
关于在 JS/TS 中,无论是在浏览器中还是在 node.js 中,是否可以接受只让异步任务运行而不保留对它的引用的指南或最佳实践?显然,如果您关心它在主线代码中的 return 值,则必须等待它,同样,如果您关心在主函数完成之前报告错误。还有哪些案例和注意事项?
明确地说,我不是在询问意见,我是在问在“触发和遗忘”异步任务时要记住的重要事项(如果这是正确的术语)。
我想我通常会担心的是,你们有处理错误的机制吗?
eslint 有一个 no-floating-promises
规则,至少强制你添加一个 .catch()
,我认为这很好。
是否以及何时执行此操作将是一个见仁见智的问题,因此该部分与 Stack Overflow 无关。
但具体的问题是:如果你这样做,有什么注意事项吗?答案是:是的。您需要捕获并处理错误。
考虑一下这个 return 承诺的即发即弃异步调用:
doSomethingAsync();
如果正在做的事情可能会失败,那么该承诺可能会被拒绝。如果它被拒绝并且没有任何东西可以处理该拒绝,那么:
- 在浏览器中,您收到一条写入浏览器控制台的错误。 99.9999999% 的用户不会注意到。
- 在 Node.js 中,您将此错误写入控制台:
(node:26477) [DEP0018] DeprecationWarning: 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.
请注意警告:在某些时候,Node.js 的未来版本可能会开始 *终止进程 当您允许未处理承诺拒绝时。
因此,如果您采用即发即弃的方式,请务必捕获错误,即使您只是静静地吞下它们:
doSomethingAsync().catch(error => {}); // Obviously only do this if you really don't
// care about the error!
有趣的旁注:在 JavaScript 中,您一直有未处理的承诺 fulfillment。考虑:
doSomethingAsync()
.then(result => {
// ...do something with result...
})
.catch(error => {
// ...handle/report the error...
});
所有的promise都在那里处理了吗?
没有。这很好。
请记住,then
和 catch
创建并 return 承诺。上面由 catch
编辑的承诺 return 没有附加处理程序。没关系,只要它只是曾经实现过,而不是被拒绝过。没有什么能对这种满足做任何事情。 :-)
来自 python 异步背景,在 python 中,始终跟踪异步任务(承诺)非常重要。运行时为没有引用的“浮动”异步任务提供错误。但是,在 Javascript 中,在某些情况下,只启动异步任务而不等待它甚至记住它的 Promise 似乎完全可以,例如,如果你不关心它的 return 值而只是希望它“稍后”执行。
关于在 JS/TS 中,无论是在浏览器中还是在 node.js 中,是否可以接受只让异步任务运行而不保留对它的引用的指南或最佳实践?显然,如果您关心它在主线代码中的 return 值,则必须等待它,同样,如果您关心在主函数完成之前报告错误。还有哪些案例和注意事项?
明确地说,我不是在询问意见,我是在问在“触发和遗忘”异步任务时要记住的重要事项(如果这是正确的术语)。
我想我通常会担心的是,你们有处理错误的机制吗?
eslint 有一个 no-floating-promises
规则,至少强制你添加一个 .catch()
,我认为这很好。
是否以及何时执行此操作将是一个见仁见智的问题,因此该部分与 Stack Overflow 无关。
但具体的问题是:如果你这样做,有什么注意事项吗?答案是:是的。您需要捕获并处理错误。
考虑一下这个 return 承诺的即发即弃异步调用:
doSomethingAsync();
如果正在做的事情可能会失败,那么该承诺可能会被拒绝。如果它被拒绝并且没有任何东西可以处理该拒绝,那么:
- 在浏览器中,您收到一条写入浏览器控制台的错误。 99.9999999% 的用户不会注意到。
- 在 Node.js 中,您将此错误写入控制台:
(node:26477) [DEP0018] DeprecationWarning: 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.
请注意警告:在某些时候,Node.js 的未来版本可能会开始 *终止进程 当您允许未处理承诺拒绝时。
因此,如果您采用即发即弃的方式,请务必捕获错误,即使您只是静静地吞下它们:
doSomethingAsync().catch(error => {}); // Obviously only do this if you really don't
// care about the error!
有趣的旁注:在 JavaScript 中,您一直有未处理的承诺 fulfillment。考虑:
doSomethingAsync()
.then(result => {
// ...do something with result...
})
.catch(error => {
// ...handle/report the error...
});
所有的promise都在那里处理了吗?
没有。这很好。
请记住,then
和 catch
创建并 return 承诺。上面由 catch
编辑的承诺 return 没有附加处理程序。没关系,只要它只是曾经实现过,而不是被拒绝过。没有什么能对这种满足做任何事情。 :-)