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

如何在函数中正确返回Promise resolve的值,解决提前返回undefined的问题

问题原因

你当前的写法有3个核心问题导致返回undefined:

  • dataSource是在then回调的if分支内用const声明的,属于块级作用域,函数末尾的return根本访问不到这个变量,天然就会返回undefined。
  • forEach遍历不会等待内部的异步任务执行完成,你没等所有.then和await callDataSource()的逻辑跑完,函数就已经执行到return语句了。
  • 你在then的回调函数里用了await,但这个回调本身没有加async标识,语法层面也无法正常执行。

调整方案

你需要将遍历产生的所有异步任务收集起来,用Promise.all统一等待执行完成后再返回结果,调整后的代码示例如下:

public async getMainData(): Promise<any> {
  const data = await this.getSubData();
  // 收集所有异步任务
  const taskList = data.map(async (result) => {
    const finalResult = await result;
    if (finalResult === 'success') {
      // 符合条件的返回调用结果
      return await this.callDataSource();
    }
    return null;
  });
  // 等待所有任务执行完成
  const allResults = await Promise.all(taskList);
  // 过滤掉不符合条件的null值,可根据业务需要调整返回逻辑,比如返回第一个有效值/返回所有有效值
  const dataSourceList = allResults.filter(item => item !== null);
  return dataSourceList;
}

调整说明

  • 把forEach替换为map,将每个遍历项的异步处理逻辑包装为独立的Promise实例,存入数组统一管理
  • 用Promise.all等待所有异步任务执行完成后,再处理返回结果,不会出现提前返回的问题
  • 调整了变量作用域,把要返回的结果提升到函数顶层可访问的范围,避免作用域隔离导致的取值失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:06:02