TypeScript中带try/catch的异步返回值函数最佳实现方案
代码报错核心原因
你的代码存在3个直接触发TS类型校验失败、同时会引发运行时bug的问题:
async/await与.then链式调用混用但未等待Promise执行:try块内的axios.get()没有加await关键字,请求发起后会直接同步执行后续代码,不会等待响应返回给data赋值;同时未被await的异步Promise抛出的错误无法被外层try/catch捕获,catch块实际永远不会触发。- 成功路径无明确返回值:
.then()回调内的return data是回调函数的返回值,不是外层getData函数的返回值,TS检测到函数成功分支无返回值,与声明的Promise<number[]>返回类型不匹配。 - 调用方逻辑错误:
getUnixTime是async函数,标注返回值为number不符合语法要求(async函数返回值必须是Promise类型);调用this.getData()时未加await,拿到的是Promise对象而非实际的数字数组,直接访问data[0]必然触发类型错误。
最佳实现方案
根据你提到的「请求出错可返回空数组/抛出错误」两种需求,分别对应实现如下:
方案1:请求失败返回空数组(内部吞错,返回默认值)
适合不需要上层感知请求错误、用默认空值兜底的场景:
import axios from 'axios'; static getData = async (): Promise<number[]> => { try { // 给axios加泛型标注,自动推导res.data类型为number[] const res = await axios.get<number[]>(`endpoint/getData`); return res.data; } catch (error) { // 可按需打印错误日志方便排查 console.error('拉取数据失败:', error); return []; } }; static getUnixTime = async (): Promise<number> => { const data = await this.getData(); // 增加空判断,避免空数组取[0]得到undefined引发计算异常 if (!data.length) { // 按业务需求返回默认值即可 return 0; } return data[0] / 1000; };
方案2:请求失败抛出错误,交给上层处理
适合需要上层感知错误、统一做异常提示/降级的场景:
import axios from 'axios'; static getData = async (): Promise<number[]> => { // 不需要手动写catch,请求异常会自动向上抛出 const res = await axios.get<number[]>(`endpoint/getData`); return res.data; }; static getUnixTime = async (): Promise<number> => { try { const data = await this.getData(); if (!data.length) return 0; return data[0] / 1000; } catch (error) { // 统一处理请求/计算阶段的异常,比如弹提示、返回默认值 console.error('获取时间戳失败:', error); return 0; } };
编写异步函数注意两个通用规则:
- 优先统一用
async/await语法,不要无意义混用.then链式调用,避免出现返回值、异常捕获逻辑脱节的问题- 调用async函数必须用
await接收结果,否则拿到的永远是Pending状态的Promise对象,无法直接操作内部返回值
内容的提问来源于stack exchange,提问作者quefro
相关产品推荐
相关产品推荐

