如何将双层for循环转换为数组的map/forEach方法?
数组方法改写异步双层循环的实现
原代码逻辑是串行调用testMyData接口,将每个返回的数组元素依次追加到结果数组中。下面提供两种符合需求的改写方式:
1. 并行处理(效率优先)
如果testMyData的调用之间没有依赖关系,推荐用map配合Promise.all实现并行调用,再通过flat合并结果数组,执行效率远高于原串行逻辑:
const mergeResults = async (items: string[]): Promise<MyArray[]> => { // 用map生成所有异步请求的Promise const requestPromises = items.map(item => testMyData(item)); // 等待所有请求完成,再合并结果 const allResults = await Promise.all(requestPromises); return allResults.flat(); };
更简洁的写法:
const mergeResults = async (items: string[]): Promise<MyArray[]> => { return Promise.all(items.map(testMyData)).then(results => results.flat()); };
2. 保持串行逻辑(与原代码行为一致)
如果需要严格按照原数组顺序串行执行testMyData,可以用reduce方法累积异步结果:
const mergeResults = async (items: string[]): Promise<MyArray[]> => { return items.reduce(async (accPromise, item) => { // 先等待上一次的累积结果 const accumulated = await accPromise; // 执行当前异步请求 const currentResult = await testMyData(item); // 合并到累积数组中 return [...accumulated, ...currentResult]; }, Promise.resolve([] as MyArray[])); };
关于forEach的说明
forEach本身不支持等待异步回调完成,遍历过程中会同步触发所有异步操作,无法保证串行执行顺序。如果一定要用forEach,只能实现并行逻辑(效果和第一种方式类似),但代码可读性不如map + Promise.all,因此不推荐。
内容的提问来源于stack exchange,提问作者Mika
相关产品推荐
相关产品推荐

