运行Node v 8+,以及bluebird和lodash库。
这里是一组伪造的物体:
const theList = [
{name: 'foo'
values: [ promise, promise, promise ] },
{name: 'bar',
values: [ promise ] }
];
我如何编写承诺解析器,以便可以迭代整个对象数组,并解析包含承诺数组的属性?每个承诺都将分解为一系列对象...因此最终可能看起来像:[ [resolvedObj1], [resolvedObj1,resolvedObj2,resolvedObj3], [resolvedObj1, resolvedObj2] ]
我希望他们都解决这个问题,以使我拥有以下对象:
let resolved = [
{name: 'foo',
values: [resolved, resolved, resolved, resolved, resolved]},
{name: 'bar',
values: [resolved]}
];
这是我当前的解决方案:
const resolvedCollection= await Promise.map(theList, async obj=> {
const resolved = await Promise.all(obj.values);
obj.values = _.flatten(resolved); // lodash "flatten" function
return obj;
});
是否有一种更清洁的方法?也许我不需要对每个迭代的对象的values
属性进行硬编码的方式?
答案 0 :(得分:1)
您的方法似乎很干净。这是我的写法:
const theList = [
{
name: 'foo',
values: [ promise, promise, promise ]
},
{
name: 'bar',
values: [ promise ]
}
];
theList.map(item =>
({
...item,
values: _.flatten(await Promise.all(item.values))
})
)
此外,由于它只有两个级别,因此您可以轻松地替换flatten
函数而无需任何递归。
[[1], [2, 3], [4, 5]].reduce((a, b) => [...a, ...b])
应用于原始解决方案的内容如下:
theList.map(item =>
({
...item,
values: (await Promise.all(item.values).reduce((a, b) => [...a, ...b]))
})
)
精心设计的问题。