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

调用async函数getAllCams返回Promise而非预期数组,求排查原因

问题分析与解决方案

核心原因:Async函数的本质

你遇到的问题其实是对async函数的基础特性理解有偏差——所有async函数的返回值都会被自动包装成Promise对象,不管你在函数内部用了多少个await。哪怕你在getAllCams里return的是newData或者ApiService.FAILURE,这些值都会被包裹成Promise.resolve(newData)或Promise.resolve(ApiService.FAILURE)。

所以你直接调用const listOfCams = apiService.getAllCams();时,得到的必然是Promise,而不是最终的结果值。


两种正确获取结果的方式

方式一:在componentWillMount中使用async/await

你可以把componentWillMount改成async函数(注:React官方现在更推荐用componentDidMount,但针对你当前的代码场景可以这么改),然后用await来获取async函数的最终结果:

async componentWillMount() {
  loggingService.debug('component will mount');
  try {
    const listOfCams = await apiService.getAllCams();
    loggingService.debug('here is your data', listOfCams);
    // 这里可以处理listOfCams的数据,比如更新组件state
  } catch (e) {
    loggingService.debug('Failed to get cams list', e);
  }
}

方式二:使用.then()链式调用

如果你之前用.then()没成功,大概率是写法有误,正确的写法应该是:

componentWillMount() {
  loggingService.debug('component will mount');
  apiService.getAllCams()
    .then(listOfCams => {
      loggingService.debug('here is your data', listOfCams);
      // 处理数据逻辑
    })
    .catch(e => {
      loggingService.debug('Failed to get cams list', e);
    });
}

额外优化:修复getAllCams的catch块

你的getAllCams函数里的catch块没有返回任何值,这会导致如果请求抛出错误时,函数会返回一个resolved状态的Promise(值为undefined),而不是你预期的ApiService.FAILURE。建议修改catch块:

async getAllCams() {
  try {
    const getAlarmListRes = await fetch(`someurl`, {
      method: 'GET',
      headers: new Headers({
        Authorization: `Basic ${base64.encode('user-id:1234')}`,
        'Content-Type': 'application/json'
      })
    });
    if (getAlarmListRes.status === 200) {
      const newData = await getAlarmListRes.json();
      if (newData !== '') {
        loggingService.debug('here is your array', newData.alarms);
        return newData;
      }
      return ApiService.FAILURE;
    }
    loggingService.debug('Was not able to get alarm list for you', getAlarmListRes);
    return ApiService.FAILURE;
  } catch (e) {
    loggingService.debug('could not get alarm list', e);
    // 加上这行,确保出错时返回预期的FAILURE
    return ApiService.FAILURE;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:45:54