javascript - 如果一个承诺可以被拒绝,那么我们应该如何处理它,或者甚至不处理它或抓住它?
问题描述
如果在某些情况下可以拒绝一个承诺,由于这种拒绝,仍然会抛出一个错误。我们应该如何处理或忽略它?
案例1:如果用户可以点击取消按钮并且操作被取消,并且我们认为这样的取消是可以的,我们是否只是处理它:
p.then(value => {
// fulfillment handler
}, err => {}); // do nothing
或者
p.then((value) => {
// fulfillment handler
}).catch(err => {}); // do nothing
或者我们可以完全忽略它而不使用拒绝处理程序或 catch()?
案例2:如果我们做一个
let p = Promise.reject(1);
然后立即抛出异常。连抓它的时间都没有。那么我们必须始终使用:
let p = Promise.reject(1).catch(err => {});
? 实际上,如果p
打印了上面,它是一个已解决的承诺,而没有的catch()
则是一个被拒绝的承诺,所以我有点困惑。我认为两者都应该处于拒绝状态。
解决方案
如果您使用承诺拒绝/异常来表示某些事情已被取消,那么捕获此错误是有意义的。
但是,一个重要的经验法则是,如果您捕获一个错误并且您希望抛出某个错误(例如 CancellationError),您应该在您的 catch 子句中确保它是该类型的特定错误。
否则,您将冒着被(空)catch 处理程序抛出并默默吃掉一些其他异常的风险。
所以我通常希望这看起来像这样:
try {
await someOperation();
} catch (err) {
if (!(err instanceof Cancellation)) {
// Re-throw
throw err;
}
console.log('Operation cancelled');
}
推荐阅读
- java - 将业务逻辑委托给 Spring Boot REST 中的另一个进程
- applescript - 如何在applescript中接受用户语音输入
- python - Pandas read_csv 只为一个文件 python 将所有内容读入一列
- vue.js - 从 Visual Studio Code 调试 vue-cli 3 生成的应用程序
- sql - 如何在 MS Access 和 SQL Server 之间创建实时连接?
- c++ - 当向量大小不恒定时,如何将队列推入队列向量?
- vba - VB脚本从excel复制到word,然后从word复制到剪贴板
- python - xlsxwriter 条件格式 icon_set 中间值= 0 不显示正确的箭头
- ruby-on-rails - 如何在 Elasticsearch 中进行基于文档的授权?
- c# - 错误 CS0234:命名空间“Microsoft”中不存在类型或命名空间名称“VisualStudio”(您是否缺少程序集引用?