Node.js-将对属性的承诺数组解析为对象数组

时间:2018-07-02 18:07:02

标签: javascript arrays node.js promise

运行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属性进行硬编码的方式?

1 个答案:

答案 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]))
  })
)

精心设计的问题。