【发布时间】:2019-05-19 10:39:32
【问题描述】:
在处理由于不可预见的未捕获异常而无法解决的承诺时,我看到了一些不一致的行为。似乎取决于我如何链接承诺会改变这个承诺是否会解决,我不明白为什么。
这是不好的功能:
function bad() {
return new Promise(resolve => {
setTimeout(() => {
throw 'unforseen exception!';
resolve();
}, 50);
});
}
如果我以这些方式调用此函数,它不会解析:
bad().then(() => console.log('resolved')); // no console logging
try {
await bad();
} catch(e) {
console.log(e);
}
console.log('resolved'); // no console logging
但是这样称呼它确实可以解决:
Promise.resolve().then(bad()).then(() => console.log('resolved')); // console logs "resolved"
为什么会这样? 编辑:我现在明白我做错了什么。但我真正想回答的是下一部分。
当我有一系列需要连续运行并且需要继续执行的 Promise 链时,我该如何最好地保护自己免受意外异常的影响,即使链中某处出现故障也是如此?
我也尝试过使用 catch 或 finally,但它们似乎没有任何区别。一旦达到未解决的承诺,执行就会失败。
【问题讨论】:
-
一个问题是
.then(bad())....then参数是一个函数,而不是像你正在做的那样,调用函数的结果 - 你应该改为.then(bad)- -
@Jaromanda X 我并没有真正看到一个更正确的。我只是对为什么一个人的行为不同感到困惑。感谢您指出我的错误。
-
是的,我删除了评论的那部分 - 这不是唯一的问题,但这就是为什么最后一个代码片段的代码行为不同
标签: javascript exception callback promise es6-promise