Nodejs - 将属性上的承诺数组解析为对象数组
Posted
技术标签:
【中文标题】Nodejs - 将属性上的承诺数组解析为对象数组【英文标题】:Nodejs - resolve array of promises on properties to array of objects 【发布时间】:2018-12-11 00:02:07 【问题描述】:运行 Node v 8+,以及 bluebird 和 lodash 库。
这是一个假对象数组:
const theList = [
name: 'foo'
values: [ promise, promise, promise ] ,
name: 'bar',
values: [ promise ]
];
如何编写 Promise 解析器,以便可以迭代整个对象数组,并解析包含 Promise 数组的属性?每个 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
属性进行硬编码的方式?
【问题讨论】:
【参考方案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]))
)
)
很好的问题。
【讨论】:
好东西!感谢您花时间回答这个问题并帮助我!以上是关于Nodejs - 将属性上的承诺数组解析为对象数组的主要内容,如果未能解决你的问题,请参考以下文章
在 NodeJs 中使用 fast-xml-parser 将特定标签解析为数组