如何让TypeScript的mySecondFunction等待Promise.all完成后返回?
问题解决:让异步函数等待Promise完成后再返回
首先明确核心问题:mySecondFunction是同步函数,但内部包含异步的Promise操作,同步函数不会等待异步代码执行完成就直接返回初始值""。另外先提个笔误:你的myFirstMethod里调用的是mySecondMethod,但实际定义的函数名是mySecondFunction,这会导致编译错误,下面代码里我统一将函数名修正为mySecondMethod。
具体修改方案
把涉及异步操作的函数全部改为异步函数,用await替代.then()回调,确保代码等待异步任务完成后再执行后续逻辑:
export class MyHandler { entry = async (data: string[]): Promise<Map<string, string>> => { const response: Map<string, string> = new Map(); // 用await等待所有API调用完成,直接拿到结果 const results = await Promise.all( data.map(async (item) => { const apiGetDataRequest = { data: item }; const apiGetDataResponse = await this.client.apiCall(apiGetDataRequest); return apiGetDataResponse.data; }) ); // 等待myFirstMethod的异步结果,再填充Map for (const result of results) { const value = await this.myFirstMethod([1, 2, 3]); response.set(result, value); } return response; }; // 改为async函数,返回Promise<string>,等待mySecondMethod的结果 myFirstMethod = async (items: number[]): Promise<string> => { const result = await this.mySecondMethod(items); console.log(result); return result; }; // 修正函数名,改为async函数,用await等待所有API调用完成 mySecondMethod = async (items: number[]): Promise<string> => { const results = await Promise.all( items.map(async (item) => { const apiCallRequest = { data: item }; const apiCallResponse = await this.client.apiCall(apiCallRequest); return apiCallResponse.data; }) ); // 拼接结果,去掉开头多余的逗号 let finalResult = ""; for (const result of results) { finalResult = finalResult + ', ' + result; } return finalResult.replace(/^, /, ''); }; }
关键修改说明
- 异步函数标记:所有使用
await的函数必须添加async关键字,返回值会自动包装为Promise类型。 - 替换.then()为await:避免回调嵌套,同时确保代码按顺序执行,等待异步任务完成后再处理结果。
- 修正entry方法逻辑:原代码中
response会在Promise.all完成前被返回,导致返回空Map,现在用await等待结果后再填充Map。 - 结果优化:拼接字符串后去掉开头的
,,避免返回的字符串以逗号开头。
内容的提问来源于stack exchange,提问作者markfw
相关产品推荐
相关产品推荐

