嵌套for循环中解决ESLint no-await-in-loop报错的优雅方案
问题解决方案
你不需要靠索引对齐两次遍历的结果,在Promise.all的map阶段直接把region和对应的请求结果绑定即可,写法简洁还不会出现索引错位的问题:
async function test() { const regions = ["emea", "apac"]; // 并发请求所有region的用户,同时绑定所属region信息 const regionDataList = await Promise.all( regions.map(async (region) => ({ region, users: await getRegionUsers(region) })) ); // 直接遍历处理结果,不需要额外匹配索引 for (const { region, users } of regionDataList) { for (const user of users) { sendMail(user, region); } } } test();
这个写法的优势很明显:
- 没有冗余遍历逻辑,不需要额外维护数组索引的对应关系,从根源避免索引错位导致的参数传错问题
- 代码结构和你最初的串行写法几乎一致,可读性很强,后续加错误捕获、新增处理逻辑都不需要改动整体结构
- 既保留了
Promise.all并发请求的性能优势,又解决了参数关联的问题
额外提一句:no-await-in-loop 规则的设计初衷是提醒开发者排查循环里不必要的串行阻塞,不是强制禁止所有循环内的await。如果你的业务场景本身就需要串行请求(比如接口限流、后续请求依赖上一轮的返回结果),那循环内写await本身就是合理实现,这时候直接加注释忽略该行ESLint校验反而是更合适的选择,没必要为了符合规则硬改逻辑。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

