从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
相关产品推荐
相关产品推荐

