假设我有2个catch
s,如下所示:
try {
axios.get('https://example.com', {})
.then(function (responseOne: any) {
return axios.post('https://example.com', {}, {})
}).then(function (responseTwo: any) {
return axios.put('https://example.com', {}, {})
}).then(function (responseThree: any) {
return axios.post('https://example.com', {}, {})
}).then(function () {
reply.send
}).catch(error) => {}
} catch(errorOuter) => {}
从我所读到的-它只会进入外部catch,第一个axios调用是await axios.get(...)
,这是正确的吗?如果每个then
块也是await
呢?
如果代码保持原样,它是否只会进入内部捕获。如果是这样,我想我可以删除外部捕获。
2条答案
按热度按时间of1yzvn41#
它只会进入外部catch,第一个axios调用是wait axios. get(...),对吗?
不太喜欢。
axios.get('https://example.com', {})
返回的承诺由then
处理,并且对于直到catch
结束的子序列承诺也是如此。如果您在第2行的开头添加
await
,那么您将等待对catch()
的调用返回的承诺。传递给
catch()
的回调捕获并丢弃承诺链上任何位置的任何异常。因此,它永远不会进入外部捕捉。
如果代码保持原样,它是否只会进入内部捕获。如果是这样,我想我可以删除外部捕获。
从技术上讲,是的,但是你最好去掉
then
,只使用await
,这样代码更容易理解。sgtfey8w2#
在这个特定的例子中,我看不出“外部”
catch
(与原始try
匹配的catch
)会被调用的任何方式,除非Axios在尝试 * 调用 * 其异步操作时抛出了异常。如果发生故障,每个后续操作的链式承诺最终会到达
Promise
中对.catch()
的链式调用,但是 * 整个链 * 是一个大的异步操作,整个try
块在操作到达任何地方之前完成并退出。(That is......如果您要在显示的所有代码之后立即添加一条
console.log
语句,您将看到该语句在任何 AJAX 操作返回之前到达。)在这种情况下,“外部”try/catch仅在您从链接
.then()
回调切换到使用await
时才有用。