<分区>
我遇到过多个应用程序,其中使用 catch 优于 rejectHandler。 例如: 喜欢
new Promise.then(resolveHandler).catch()
代替
new Promise().then(resolveHandler, rejectHandler).catch()
这有什么特别的原因吗??
我找到了
new Promise().then(resolveHandler, rejectHandler).catch()
更有用因为
- 我可以使用 rejectHandler 解决调用 Promise.reject 的设计/预期错误场景。
- 我可以使用 catch block 来解决发生的未知/意外编程/运行时错误。
有人知道 rejectHandler 很少使用的任何特殊原因吗?
附言我知道 ES6 中有更新的替代方案,但我只是想知道这一点。
更新:我知道 rejectHandler 和 catch 是如何工作的。问题是为什么我看到更多人只使用 catch 而不是 rejectHandler 和 catch?这是最佳做法还是有一些优势?
更新(在此处添加答案):找到了我一直在寻找的第一手答案。 原因不仅仅是因为 reject 中的错误是由 catch 处理的,主要是因为链接。当我们链接 promise.then.then.then.then 时,有一个 resolve,reject 模式证明链接它有点棘手,因为您不想实现一个 rejecthandler 只是为了将 rejectData 转发到链上。仅使用 promise/then/catch 和 resolve/return/throw 证明在链接 N 个 thenable 时非常有用。 @Bob-Fanger(接受的答案)也解决了其中的一部分。 例如:
getData(id) {
return service.getData().then(dataList => {
const data = dataList.find(data => {
return data.id === id;
});
if (!data) {
// If I use Promise.reject here and use a reject handler in the parent then the parent might just be using the handler to route the error upwards in the chain
//If I use Promise.reject here and parent doesn't use reject handler then it goes to catch which can be just achieved using throw.
throw {
code: 404,
message: 'Data not present for this ID'
};
}
return configuration;
});
}
//somewhere up the chain
....getConfiguration()
.then(() => {
//successful promise execution
})
.catch(err => {
if (err.code) {
// checked exception
send(err);
} else {
//unchecked exception
send({
code: 500,
message: `Internal Server error: ${err}`
});
}
});
仅使用这些我需要担心的是 promise/then/catch 以及链中任何位置的 resolve/return/throw。