如何从Promise的.then获取值?回调返回undefined及函数取数问题解决
解决Promise异步数据获取问题
我来帮你分析下问题所在,以及如何在函数外部拿到异步数据:
问题根源
你当前的foo函数有两个关键问题:
- 没有返回值:函数内部生成了Promise数组,但没有把这个数组(或者处理后的Promise)返回出去,所以调用
foo(mycallback())自然会得到undefined。 - 未处理Promise集合:
periods.map生成的是多个Promise的数组,你需要等待所有Promise都完成才能拿到完整的结果集合。
修正后的代码
首先,我们调整foo函数,让它返回一个能拿到所有结果的Promise:
function foo() { // 生成每个period对应的Promise const myPromises = periods.map((p) => { return new Promise((resolve, reject) => { myFunctions.getPropoalByPeriod(p.id, localStart, function(err, rows) { if (err) { console.log(62, err); return reject(err); } // 补全你未写完的obj结构 const obj = { id: p.id, name: p.name, data: rows // 假设你需要把返回的rows也存入obj }; // 把处理好的obj传给resolve resolve(obj); }); }); }); // 返回Promise.all,等待所有Promise完成后拿到结果数组 return Promise.all(myPromises); }
在外部获取数据的两种方式
因为异步操作的结果无法同步获取,你需要用以下两种方式之一来处理:
方式1:使用.then()链式调用
foo() .then((allObjs) => { console.log('所有异步请求的结果:', allObjs); // 在这里做后续的数据处理逻辑 }) .catch((error) => { console.error('请求过程中出错:', error); });
方式2:使用async/await(更直观的同步写法)
// 必须在async函数内部使用await async function processData() { try { const allObjs = await foo(); console.log('所有异步请求的结果:', allObjs); // 后续处理逻辑写在这里 } catch (error) { console.error('请求过程中出错:', error); } } // 调用这个async函数 processData();
额外说明
你原代码里的callback参数看起来没有实际用到,可以直接去掉,避免混淆。如果原本有回调相关的逻辑,可以结合Promise一起处理,但目前来看Promise的方式更适合批量异步请求的场景。
内容的提问来源于stack exchange,提问作者Abdulrhman Alsri
相关产品推荐
相关产品推荐

