TypeScript中catch代码块本身是否可以定义为async异步函数?
TypeScript 语法合规性说明
你给出的示例代码存在基础语法错误,修正后await接Promise链式.catch()、且.catch()传入async回调的写法,在TypeScript中是完全合规、被官方支持的。
原代码的错误点
你提供的原始代码漏写了.catch()方法调用的闭合右括号,属于语法层面的书写错误,和写法逻辑本身无关:
// 原错误代码 const x = await function1().catch(async (error) => { await function2(); };
补全括号后的正确可运行写法如下:
const x = await function1().catch(async (error) => { await function2(); });
合规性依据
.catch()方法的参数要求是「接收错误对象、返回任意值或Promise实例的回调函数」,而async函数本身就会返回Promise实例,完全匹配参数类型要求,TS不会报类型错误。await关键字的语法规则是允许后接任意Promise实例,function1().catch(/* 回调 */)整个链式调用的返回值本身就是一个新的Promise实例,前面加await完全符合语法规范。- 该写法和标准async/await、Promise链式调用的规范完全一致,不存在非标准的语法问题。
注意:该写法的运行逻辑为:如果
function1()执行抛错,会进入catch回调执行function2(),最终变量x的取值为catch回调的返回值(当前示例回调无return语句时x为undefined);如果function2()执行也抛错,整个await表达式仍会向外抛出异常,不会被自动捕获。
内容的提问来源于stack exchange,提问作者Jeffrey Chen
相关产品推荐
相关产品推荐

