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 将特定标签解析为数组

如何承诺等待所有对象完成然后推送到数组?

NodeJS - request对象

NodeJS - request对象

将数据从 mongodb 解析为 javascript 数组对象 [重复]

将数据从 mongodb 解析为 javascript 数组对象 [重复]