You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
  }
};

编写异步函数注意两个通用规则:

  1. 优先统一用async/await语法,不要无意义混用.then链式调用,避免出现返回值、异常捕获逻辑脱节的问题
  2. 调用async函数必须用await接收结果,否则拿到的永远是Pending状态的Promise对象,无法直接操作内部返回值

内容的提问来源于stack exchange,提问作者quefro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 22:51:16