处理承诺:如何从for循环返回具有承诺的列表?

时间:2019-05-06 07:35:36

标签: javascript typescript promise async-await amazon-cognito

我正在尝试将所有从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;  
    } 
}

这给了我所有用户响应的结果列表。谢谢!

2 个答案:

答案 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);
  })