如何编写函数解析含嵌套Promise数组的对象并返回解析结果?
搞定嵌套Promise数组对象的解析问题
嘿,这有个直接能用的resolvePromisesFunction实现,完全匹配你的需求:
function resolvePromisesFunction(obj) { // 把对象拆成键值对数组,逐个处理每个属性的Promise数组 const promiseEntries = Object.entries(obj).map(async ([key, promisesArr]) => { // 用Promise.all解析当前数组里的所有Promise const resolvedArr = await Promise.all(promisesArr); // 返回键和解析后的数组,方便后续转回对象 return [key, resolvedArr]; }); // 等所有属性的Promise都解析完,再把结果转成目标对象 return Promise.all(promiseEntries).then(resolvedEntries => Object.fromEntries(resolvedEntries)); }
为啥这么写?给你掰扯清楚:
- 拆对象:用
Object.entries(obj)把原对象转换成[键名, Promise数组]的格式,这样能遍历处理每个属性。 - 解析单个属性的Promise数组:对每个键值对,用
async/await配合Promise.all,把对应的Promise数组全部解析成普通值数组。 - 汇总结果转对象:把所有处理后的键值对Promise收集起来,用
Promise.all等全部处理完成,最后用Object.fromEntries把数组格式转回我们需要的对象结构。
测试一下看效果
用你给的示例代码跑一遍:
let promise = new Promise(resolve => setTimeout(resolve, 1000, 'url')); let object = { registration: [promise, promise, promise], contract: [promise, promise, promise], businessLicense: [promise, promise, promise], businessPlan: [promise, promise, promise] }; resolvePromisesFunction(object).then(result => console.log(result));
等1秒左右,控制台就会输出你想要的结果:
{ registration: [ 'url', 'url', 'url' ], contract: [ 'url', 'url', 'url' ], businessLicense: [ 'url', 'url', 'url' ], businessPlan: [ 'url', 'url', 'url' ] }
如果你不喜欢async/await,也可以用纯Promise链的写法,功能完全一样:
function resolvePromisesFunction(obj) { return Promise.all( Object.entries(obj).map(([key, promisesArr]) => Promise.all(promisesArr).then(resolvedArr => [key, resolvedArr]) ) ).then(resolvedEntries => Object.fromEntries(resolvedEntries)); }
选哪个全看你个人代码风格偏好~
内容的提问来源于stack exchange,提问作者Snork
相关产品推荐
相关产品推荐

