typescript JS-内和外锁扣

efzxgjgh  于 2023-03-09  发布在  TypeScript
关注(0)|答案(2)|浏览(138)

假设我有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呢?
如果代码保持原样,它是否只会进入内部捕获。如果是这样,我想我可以删除外部捕获。

of1yzvn4

of1yzvn41#

它只会进入外部catch,第一个axios调用是wait axios. get(...),对吗?
不太喜欢。
axios.get('https://example.com', {})返回的承诺由then处理,并且对于直到catch结束的子序列承诺也是如此。
如果您在第2行的开头添加await,那么您将等待对catch()的调用返回的承诺。
传递给catch()的回调捕获并丢弃承诺链上任何位置的任何异常。
因此,它永远不会进入外部捕捉。
如果代码保持原样,它是否只会进入内部捕获。如果是这样,我想我可以删除外部捕获。
从技术上讲,是的,但是你最好去掉then,只使用await,这样代码更容易理解。

try {
    await axios.get('https://example.com', {});
    await axios.post('https://example.com', {}, {});
    await axios.put('https://example.com', {}, {});
    await axios.post('https://example.com', {}, {});
    reply.send;
} catch (e) {
    // do something with e
}
sgtfey8w

sgtfey8w2#

在这个特定的例子中,我看不出“外部”catch(与原始try匹配的catch)会被调用的任何方式,除非Axios在尝试 * 调用 * 其异步操作时抛出了异常。
如果发生故障,每个后续操作的链式承诺最终会到达Promise中对.catch()的链式调用,但是 * 整个链 * 是一个大的异步操作,整个try块在操作到达任何地方之前完成并退出。
(That is......如果您要在显示的所有代码之后立即添加一条console.log语句,您将看到该语句在任何 AJAX 操作返回之前到达。)
在这种情况下,“外部”try/catch仅在您从链接.then()回调切换到使用await时才有用。

try {
  const responseOne = await axios.get('https://example.com', {});
  const responseTwo = await axios.post('https://example.com', {}, {});
  const responseThree = await axios.put('https://example.com', {}, {});
  // etc.
} catch(errorOuter) {
  // handle error
}

相关问题