异步/等待,在catch块中再次抛出错误

问题描述 投票:0回答:1

我猜想在使用

try/catch
时使用
async/await
语法来处理任何类型的拒绝会变得越来越标准。

但是如果

catch
块内有一些可能被拒绝的东西怎么办?

这不会增加嵌套级别,但行不通:

// Won't work!
try {
  await Promise.reject()
} catch (e) {
  console.log('caught rejection')
  await Promise.reject()
} catch (e) {
  console.log('caught rejection again')
}

这似乎是处理这个问题的正确方法,这工作正常,但它更难阅读并且有可能嵌套

try/catch
地狱:

try {
  await Promise.reject()
} catch (e) {
  console.log('caught rejection')
  try {
    await Promise.reject()
  } catch(e2) {
    console.log('caught rejection again')
  }
}

这种情况可以成为反对

try/catch
语法并支持旧
.then()/.catch()
语法的论点吗?或者也许还有其他更好的方法来处理类似的情况?

Promise.reject()
  .catch(() => {
    console.log('caught rejection')
    return Promise.reject()
  }).catch(() => {
    console.log('caught rejection again')
  })
javascript async-await try-catch
1个回答
0
投票

基本上,您正在尝试实现一个以承诺解析结束的异步队列。

如果将代码构造为队列,则无需嵌套

try/catch

(async () => {

  const tries = [() => Promise.reject(), () => Promise.reject(), () => Promise.resolve()];
  let idx = -1, fetch;

  while(fetch = tries[++idx]){
    try {
      await fetch();
      console.log('finally resolved, thank god');
      break;
    } catch (e) {
      console.log('caught rejection')
    }
  }

})();

© www.soinside.com 2019 - 2024. All rights reserved.