我正在使用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
我确信必须有一种方法来映射用户的每一个承诺,但我不知道。
答案 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));
请注意,首先您需要一个带有密钥/承诺的对象。