使用promises索引映射Promise.all输出

时间:2017-11-14 12:09:41

标签: node.js asynchronous async-await es6-promise

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

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

以下是示例:

[
{
  user1 Data from promise 1
},
{
  user2 Data from promise 2
},
{
  user3 Data from promise 3
}
]

在这里,我获得了所有回复的所有回复,但我实际上想要按用户进行映射。 例如,目前我正在以这种格式获取数据:

[
 {
  "user1": Data from promise 1
 },
 {
   "user2": Data from promise 2
 },
 {
   "user3": Data from promise 3
 }
]

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

gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onCpExit (C:\Users\Name\AppData\Roamin
g\npm\node_modules\node-gyp\lib\configure.js:336:16)
gyp ERR! stack     at emitTwo (events.js:106:13)
gyp ERR! stack     at ChildProcess.emit (events.js:191:7)
gyp ERR! stack     at Process.ChildProcess._handle.onexit 
(internal/child_proces
s.js:215:12)
gyp ERR! System Windows_NT 6.1.7601
gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "C:\\Users\\name\\
AppData\\Roaming\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "configure"
gyp ERR! cwd C:\Users\Name\Desktop\electron-quick-start
gyp ERR! node -v v6.10.2
gyp ERR! node-gyp -v v3.6.2
gyp ERR! not ok

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

3 个答案:

答案 0 :(得分:3)

我们将创建一个用户数组。迭代它以创建我们给Promise的{​​{1}}数组。然后迭代答案,创建一个与用户匹配的对象和Promise.all的相关答案。

要了解Promise.all的一点是,返回数据的顺序取决于输入中给出的getUsersData的顺序。

promises

Here你有关于数组方法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, })); 的精彩教程。

答案 1 :(得分:1)

虽然我接受的答案是解决方案之一,我认为这是完美的,我会保持接受的答案,但我想发布我后面想到的更简单的解决方案:

我们可以简单地使用它:

let finalData = {};
let users = ["user1", "user2", "user3"];
await Promise.all(users.map(async(eachUser) => {
    finalData[user] = await this.myApiHelper.getUsersData(eachUser);
}))
console.log(finalData);

答案 2 :(得分:-1)

如此处所述 How to use Promise.all with an object as input

这是一个简单的ES2015函数,它接受一个具有可能promises属性的对象,并返回具有已解析属性的该对象的promise。

function promisedProperties(object) {

  let promisedProperties = [];
  const objectKeys = Object.keys(object);

  objectKeys.forEach((key) => promisedProperties.push(object[key]));

  return Promise.all(promisedProperties)
    .then((resolvedValues) => {
      return resolvedValues.reduce((resolvedObject, property, index) => {
        resolvedObject[objectKeys[index]] = property;
        return resolvedObject;
      }, object);
    });

}

然后你会像这样使用它:

var promisesObject = {};
users.map((element, index) => object[element] = this.myApiHelper.getUsersData(users[index]));
promisedProperties(object).then(response => console.log(response));

请注意,首先您需要一个带有密钥/承诺的对象。