【问题标题】:Nodejs - resolve array of promises on properties to array of objectsNodejs - 将属性上的承诺数组解析为对象数组
【发布时间】: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 属性进行硬编码的方式?

【问题讨论】:

    标签: javascript arrays node.js promise


    【解决方案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]))
      })
    )
    

    很好的问题。

    【讨论】:

    • 好东西!感谢您花时间回答这个问题并帮助我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 2022-01-04
    • 2023-03-22
    • 2020-08-05
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多