如何在异步函数中返回数字或抛出错误?TSLint报错求修复
问题分析与修复方案
嘿,我来帮你搞定这个问题!你的代码里有两个核心问题,其中一个直接触发了TSLint的"Expression Expected"错误,另一个是async/await用法的冗余,我一步步给你拆解:
1. 直接报错的根源:return throw是语法错误
你在catch块里写了return throw new ErrorFactory.DatabaseError(ex);——这里的问题是:throw是一个语句,不是表达式,而return后面必须跟一个合法的表达式(比如数值、Promise对象等)。把throw放在return后面是不符合JavaScript语法的,这就是TSLint报错的原因。
而且你的需求是"失败时抛出异常",完全不需要在catch块里用return,直接抛出错误就行——async函数内部抛出的异常会自动被包装成rejected状态的Promise,正好符合你的需求。
2. 冗余的写法:混合async/await和.then()
你的函数已经声明为async了,但内部却用.then()来处理Promise,这完全没发挥出async/await简化异步逻辑的优势,反而让代码结构更绕。我们可以把它重构为纯async/await的写法,让逻辑更清晰。
修复后的代码
private async insertAppOrg(orgId): Promise<number> { try { // 用await直接获取查询结果,替代.then() const appOrgData = await this.dbInstance.AppOrg.find({ where: { orgId } }); if (appOrgData) { return appOrgData.appOrgId; } else { // 直接await创建操作的结果 return await this.createAppOrg(orgId); } } catch (ex) { // 直接抛出异常,无需return throw new ErrorFactory.DatabaseError(ex); } }
修复说明
- 移除了catch块里的
return,直接抛出错误,解决了语法错误,同时满足"失败时抛出异常"的需求。 - 用
await替代.then(),把嵌套的逻辑改成了线性结构,代码更易读、易维护。 - 简化了对象字面量的写法:
{ orgId: orgId }可以简写为{ orgId }(ES6+的语法糖)。
这样修改后,函数就能正常工作了:成功时返回对应的数字ID,失败时抛出DatabaseError异常,调用方可以通过try/catch或者.catch()来处理这个异常。
内容的提问来源于stack exchange,提问作者Manish Joshi
相关产品推荐
相关产品推荐

