如何在函数中正确返回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
相关产品推荐
相关产品推荐

