遍历数组执行异步逻辑更新变量,现有reduce写法是否有更优方案?
你当前的写法逻辑是正确的,确实可以实现串行执行Promise、更新变量的需求,但确实存在可读性更高、更简洁的实现方式,分两种常见场景给你参考:
场景1:允许并行执行Promise(无调用顺序/频率限制,优先选这个)
不需要等前一个Promise返回再调用下一个,所有请求同时发起,总耗时仅等于单个Promise的执行耗时,效率最高:
/** * @returns Resolves a promise and returns value 'b' */ async function generatePromise() { return Promise.resolve('b'); } async function main() { const users = ['a', 'b', 'c']; // 同时发起所有Promise调用,等待全部返回 const resultList = await Promise.all(users.map(() => generatePromise())); // 直接判断是否存在匹配项,不需要维护外部可变变量 const showWarning = resultList.some((res, index) => res === users[index]); console.log(showWarning); } main();
场景2:必须串行执行Promise(有调用顺序/频率限制)
用for...of写法比你当前用reduce包裹异步逻辑的写法可读性高很多,还支持匹配到结果后直接中断循环,避免多余的请求:
/** * @returns Resolves a promise and returns value 'b' */ async function generatePromise() { return Promise.resolve('b'); } async function main() { const users = ['a', 'b', 'c']; let showWarning = false; for (const user of users) { const result = await generatePromise(); if (result === user) { showWarning = true; // 匹配到结果直接中断循环,不需要继续执行后续调用 break; } } console.log(showWarning); } main();
原reduce写法的小问题补充:异步reduce的写法对不熟悉异步处理逻辑的开发者来说理解门槛较高,且匹配到符合条件的结果后无法中途中断,会遍历完整个数组,产生多余的Promise调用开销,没有特殊需求的话不推荐使用。
内容的提问来源于stack exchange,提问作者falcon
相关产品推荐
相关产品推荐

