我猜想在使用
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')
})
基本上,您正在尝试实现一个以承诺解析结束的异步队列。
如果将代码构造为队列,则无需嵌套
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')
}
}
})();