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

从Promises获取数据不正确?axios结合Firebase异步请求异常排查

问题原因及修复方案

核心问题点

  • getStockData的异常分支没有返回值也没有抛出错误:请求失败进入catch后只会打印错误,默认返回undefined,后续调用res.data会直接报错,导致最终拿到空值
  • getMyStocks中没有等待所有异步请求执行完成:你把所有请求promise存入数组后,没有调用Promise.all等待全部执行完毕,函数提前返回时数据还没拉取完成
  • tempData变量使用逻辑错误:你初始声明tempData是数组,循环中却直接赋值为对象,每次循环都会覆盖上一次的结果,最终只能拿到最后一条请求的数据
  • 你给出的代码片段存在语法缺失:forEach回调、getMyStocks函数都没有闭合的右括号,实际运行会直接报错

修复后的代码

修正getStockData异常处理逻辑

const getStockData = async (stock) => {
  try {
    const response = await axios.get(`${BASE_URL}${stock}${KEY_URL}`);
    console.log(response);
    return response;
  } catch (error) {
    console.error('Error', error.message);
    // 抛出错误让上层捕获,也可自行返回错误结构避免返回undefined
    throw error;
  }
};

修正getMyStocks异步等待和数据处理逻辑

const getMyStocks = async () => {
  const querySnapshot = await getDocs(collection(db, 'myStocks'));
  // 用map直接生成promise数组
  const promises = querySnapshot.docs.map(async (doc) => {
    const ticker = doc.data().ticker;
    console.log(ticker);
    const res = await getStockData(ticker);
    console.log(res);
    // 返回单条数据,不覆盖外部变量
    return {
      id: doc.id,
      data: doc.data(),
      info: res?.data ?? null // 可选链+空值合并避免res为空时报错
    };
  });
  // 等待所有请求完成拿到最终结果数组
  const tempData = await Promise.all(promises);
  return tempData;
};

调用注意

调用getMyStocks时需要用await或者.then获取结果,直接打印函数返回值只能拿到Promise对象,拿不到实际数据:

// 正确调用示例
getMyStocks().then(data => {
  console.log('最终股票数据:', data);
}).catch(err => {
  console.error('拉取失败:', err);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:24:04