今天我正坐在一堂Javascript课上,他们讲的内容是我以前从未见过的,而且我还不太了解。我会尽力从记忆中重现
教师不是使用Promise的catch
来处理我习惯的错误,而是使用try...catch
包裹在Promise及其then
周围。当我问他为什么这样做时,他说这是“同步”捕获错误。也就是说,不是我习惯的以下格式(我使用的是伪代码)
someLibrary.someFunctionThatReturnsAPromise
.then(() => something)
.then(() => somethingElse)
.catch(err => reportError)
他这样做了
try {
someLibrary.someFunctionThatReturnsAPromise
.then(() => something)
.then(() => somethingElse)
}
catch(err) {
reportError
}
这两种捕获错误的方式有什么区别? 包装异步的Promise如何以同步方式报告错误?
感谢您的见解!
答案 0 :(得分:1)
仅当运行 initial (同步)代码时引发错误时,try/catch
版本才会捕获该错误-它不会捕获任何{ {1}} s:
.then
因此,在代码中try {
Promise.resolve()
.then(() => {
throw new Error()
});
} catch(e) {
console.log('caught');
}
捕获错误的唯一方法是如果try/catch
同步引发。另一方面,someLibrary.someFunctionThatReturnsAPromise
/ .then
版本将捕获任何错误(并且几乎肯定是更可取的)。
答案 1 :(得分:1)
try-catch
不会捕获<somePromise>.then
周围的异步错误,因为正如您所注意到的,该块将在承诺完成/可能抛出之前退出。
但是,如果您使用的是async
/ await
,则try-catch
将被捕获,因为该块将等待await
:
async function foobar() {
try {
await doSomePromise();
} catch (e) {
console.log(e);
}
}
答案 2 :(得分:1)
实际上,您也可以在catch之后使用3条语句-最后,但这取决于)