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

如何从Promise的.then获取值?回调返回undefined及函数取数问题解决

解决Promise异步数据获取问题

我来帮你分析下问题所在,以及如何在函数外部拿到异步数据:

问题根源

你当前的foo函数有两个关键问题:

  1. 没有返回值:函数内部生成了Promise数组,但没有把这个数组(或者处理后的Promise)返回出去,所以调用foo(mycallback())自然会得到undefined。
  2. 未处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:36:25