使用承诺索引映射 Promise.all 输出

und*_*ned 4 asynchronous node.js async-await es6-promise

我正在使用 nodejs v8+,它支持默认的异步等待代码风格。

在我的问题中,我试图将所有承诺推送到一个数组中,然后使用 Promise.all 和 await 关键字来获取响应。但问题是,我无法用键映射承诺。

这是示例:

let users = ["user1", "user2", "user3"];

    let promises = [];
    for(let i = 0; i < users.length; i++){
      let response = this.myApiHelper.getUsersData(users[i]);
      promises.push(response);
    }
    let allResponses = await Promise.all(promises);
Run Code Online (Sandbox Code Playgroud)

在这里,我得到了所有响应的所有收集响应,但我实际上想按用户映射它。例如,目前我正在以这种格式获取数据:

[
{
  user1 Data from promise 1
},
{
  user2 Data from promise 2
},
{
  user3 Data from promise 3
}
]
Run Code Online (Sandbox Code Playgroud)

但我想要这种格式的数据:

[
 {
  "user1": Data from promise 1
 },
 {
   "user2": Data from promise 2
 },
 {
   "user3": Data from promise 3
 }
]
Run Code Online (Sandbox Code Playgroud)

我确信必须有一种方法来映射用户的每一个承诺,但我不知道。

Gré*_*EUT 6

我们要创建一个用户数组。迭代它以创建一个Promise我们给的数组Promise.all。然后迭代答案以创建一个对象,该对象将用户与来自 的关联答案相匹配getUsersData

关于 Promise.all 的一些知识是返回数据的顺序取决于promises它的条目中给定的顺序。


const users = ['user1', 'user2', 'user3'];

const rets = await Promise.all(users.map(x => this.myApiHelper.getUsersData(x)));

const retWithUser = rets.map((x, xi) => ({
   user: users[xi],
   ret: x,
}));
Run Code Online (Sandbox Code Playgroud)

这里有一个关于 Array 方法的很棒的教程(map, filter, some...)