我正在尝试将所有从AWS-Cogntio返回的promise推送到for循环内的列表中。我想返回与最终结果相同的列表。
因此,基本上,我试图将用户列表上传到AWS-Cognito,并且我想在列表中返回每个用户对Cognito的响应。
这是我的代码:
let list = [];
body.forEach(async(userItem) => {
await this.userService.uploadUser(userItem) //uploading every user to AWS
.then((user) => { //'user' is the promise returned from AWS
list.push(user);
console.log("list::::", list);
});
})
这是我尝试做的事情:但是列表仅包含一个值,而不包含值列表。
return new Promise((resolve) => {
body.forEach(async(userItem) => {
await this.userService.uploadUser(userItem) //uploading every userItem to AWS
.then((user) => { //'user' is the promise returned from AWS
list.push(user);
console.log("list::::", list);
});
})
}).then((data) => {
return res.send(list); //same list of promises
})
这是我尝试为多个用户上传时得到的输出:
[
{
"message": "An account with the given email already exists.",
"code": "UsernameExistsException",
"time": "2019-05-06T07:15:28.113Z",
"statusCode": 400,
"retryable": false,
"retryDelay": 57.99626693113027
}
]
编辑: 从下面给出的答案中,这是可行的:使用map而不是for循环将返回具有诺言的列表的相同长度。
try {
let promises = body.map(async(userItem) => {
let user = await this.userService.uploadUser(userItem);
return await new Promise((resolve) => {
resolve(user);
})
});
let data = await Promise.all(promises);
res.send(data);
} catch (error) {
throw error;
}
}
这给了我所有用户响应的结果列表。谢谢!
答案 0 :(得分:1)
很遗憾,forEach
不了解async/await
。因此,请尝试使用map返回所需的诺言列表。
请参阅此以获取有关async/await in loops的更多信息。
我不知道我是否理解正确,但这是我会做的:
const list = body.map(async (userItem) => {
await this.userService.uploadUser(userItem))
});
Promise.all(list).then(() => console.log('worked')).catch(() => console.log('it didnt work'));;
希望这会有所帮助!
答案 1 :(得分:0)
return Promise.all(body.map(userItem => this.userService.uploadUser(userItem))
.then((list) => {
res.send(list);
})