如何将Promise.all并行执行结果转换为键值对形式?
优雅实现并行Promise结果转为键值对象
这里有几种简洁优雅的方案,既能保留Promise.all的并行执行特性,又能得到你想要的结构化结果:
1. 基于Object.entries + Object.fromEntries的直接实现
先把任务包装成键值对对象,再通过映射让每个Promise完成后带上对应的键,最后组装成目标对象:
// 假设taskA、taskB是返回Promise的函数 const tasks = { taskA: taskA(), taskB: taskB() }; // 转换为[key, promise]数组,再映射为[key, resolvedResult]数组 const resolvedEntries = await Promise.all( Object.entries(tasks).map(([key, promise]) => promise.then(result => [key, result]) ) ); // 转成目标对象 const res = Object.fromEntries(resolvedEntries);
这种方式不需要额外封装,原生API就能搞定,逻辑清晰,任务数量扩展时也不用修改核心逻辑。
2. 封装复用工具函数
如果需要多次使用这种逻辑,可以封装成一个工具函数,让调用更简洁:
async function promiseAllToObject(tasks) { const resolvedEntries = await Promise.all( Object.entries(tasks).map(([key, p]) => p.then(val => [key, val])) ); return Object.fromEntries(resolvedEntries); } // 调用示例 const res = await promiseAllToObject({ taskA: taskA(), taskB: taskB() });
这个函数可以放在项目的工具库中,后续任何需要并行执行Promise并获取键值结果的场景都能直接用。
补充:处理失败场景(可选)
如果需要处理部分任务失败的情况,可以把Promise.all换成Promise.allSettled,然后按需处理结果:
async function promiseAllSettledToObject(tasks) { const settledEntries = await Promise.allSettled( Object.entries(tasks).map(([key, p]) => p.then(result => ({ key, status: 'fulfilled', value: result })) .catch(error => ({ key, status: 'rejected', reason: error })) ) ); // 组装结果,这里示例只保留成功项,失败项赋值为null const res = {}; settledEntries.forEach(item => { res[item.key] = item.status === 'fulfilled' ? item.value : null; }); return res; }
内容的提问来源于stack exchange,提问作者funerr
相关产品推荐
相关产品推荐

