简体   繁体   English

for循环中的异步等待

[英]Async await in for loop

I have this function and I'm trying to push objects into the "groupData" array and then return the response object but when the function successfully runs, I get "response" as a null object. I have this function and I'm trying to push objects into the "groupData" array and then return the response object but when the function successfully runs, I get "response" as a null object. What is wrong with my code can anyone help?我的代码有什么问题有人可以帮忙吗? How can I make the function to wait for the map function to finish and then return.如何让 function 等待 map function 完成然后返回。

const groupList = async (io, socket, userid) => {
  var response = {};
  try {
    var groupData = [];
    ddb.get({
        TableName: "Tablename",
        Key: { Username: userid },
      })
      .promise()
      .then(async (user) => {
        if (Object.keys(user).length === 0) {
        } else {
          const groups = user.Item.Chatgroups;
          groups.map((g) => {
              ddb.get({
                  TableName: "Tablename",
                  Key: { ChatID: g },
                })
                .promise()
                .then(async (data) => {
                  groupData.push({
                    ChatID: g,
                    Chatname: data.Item.Chatname,
                    Group: data.Item.Group
                  });
                })
                .catch((err) => {
                  console.log("Chat group not found");
                });
            })
            response["groups"] = groupData;
        }
      })
      .catch((err) => {
        response["code"] = 400;
        response["message"] = "Something Went Wrong";
      });
  } catch (error) {
    console.log(error);
  } finally {
    return response;
  }
};

I searched too long for this我为此搜索了太久

for await (item of items) {}

Use Promise.all and if you use async then make use of await .使用Promise.all如果你使用async然后使用await

Here is how your code could look.这是您的代码的外观。 I removed the error handling -- first test this and when it works, start adding back some error handling (with try/catch ):我删除了错误处理——首先测试它,当它工作时,开始添加一些错误处理(使用try/catch ):

const groupList = async (io, socket, Username) => {
    const user = await ddb.get({
        TableName: "Tablename",
        Key: { Username },
    }).promise();
    if (!Object.keys(user).length) return {};
    return {
        groups: await Promise.all(user.Item.Chatgroups.map(async ChatID => {
            const { Item: { Chatname, Group } } = await ddb.get({
                TableName: "Tablename",
                Key: { ChatID },
            }).promise();
            return { ChatID, Chatname, Group };
        }))
    };
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM