try...catch
:new Promise.then(resolveHandler).catch()
替代
new Promise().then(resolveHandler, rejectHandler).catch()
这个有特别的原因吗? 我觉得
new Promise().then(resolveHandler, rejectHandler).catch()
为了更加有用,因为
- 我可以使用rejectHandler来解决设计/预期的错误场景,其中调用Promise.reject。
- 我可以使用catch块来处理发生的未知/意外编程/运行时错误。
有人知道为什么不经常使用rejectHandler吗?
P.S. 我知道ES6中有更新的替代方法,但我只是想知道这个问题。
更新:我知道rejectHandler和catch如何工作。问题是为什么我看到更多的人仅使用catch而不是同时使用rejectHandler和catch?这是最佳实践还是存在某些优势?
更新(在此添加答案):找到了我一直在寻找的答案。 原因不仅是出于catch中处理拒绝的错误,主要是由于链接。 当我们链接promise.then.then.then.then时,具有resolve,reject模式会有些棘手,因为您不希望实现rejecthandler来将rejectData转发到上面的链。 仅使用promise / then / catch以及resolve / return / throw在链接N个thenables时非常有用。 @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。
promise.then(resolveHandler, rejectHandler).catch(catchHandler)
这种“模式”。然后我意识到需要重新审视需求,因此不再使用该模式。 - Jaromanda X.catch()
处理程序还将捕获resolveHandler
内部的任何异常或拒绝,但rejectHandler
不会。 - jfriend00