在我的 db.collection forEach 上使用 Promise.all

Using Promise.all on my db.collection forEach

如何将 promise.all 与此功能一起使用:

function getUsersGroups(users, req) {
  users.forEach(function(user) {
    user.groups = [];

    db.collection("groups")
      .find({ "users._id": String(user._id) })
      .toArray(function(err, docs) {
          user.groups = docs;
      });
  });

  return users;
}

不知道怎么办,谢谢。

PS:用户数组没有通过文档实现(他们控制日志正常)。

这是我第二次尝试 :

function getUsersGroups(users, req) {
  users.forEach(
    (user, index, array) => (
      array[index].user =[]
      array[index].user.groups = myApiCall(user))
  );

  function myApiCall(user) {
    db.collection("groups")
      .find({ "users._id": String(user._id) })
      .toArray(function(err, docs) {
        console.log(docs);
        return docs;
      });
  }

  return users;
}



  array[index].user.groups = myApiCall(user))
      ^^^^^

SyntaxError: Unexpected identifier

编辑:

所以最后,我正在使用这个功能,就像 Ashish 说的那样(它获取用户所在的所有组,并更新用户模型):

async function getUsersGroups(users, req) {
  await Promise.all(users.map(user => {
    return db.collection("groups")
      .find({ "users._id": String(user._id) })
      .toArray()
      .then(group => {
        user.groups = group;
      })
  }));

  return users;
}

我在另一个 node.js 函数中这样调用 :

 getUsersGroups(docs, req)
          .then(users => {
            res.send(users);
          })
          .catch(error => {
            // if you have an error
          });

非常感谢!

async function getUsersGroups(users, req) {
  await Promise.all(users.map(user => {
    return db.collection("groups")
      .find({ "users._id": String(user._id) })
      .toArray()
      .then(group => {
        user.groups = group;
      })
  }));

  return users;
}

希望对您有所帮助

查看 toArray 的文档,如果未指定回调,它 returns 一个 Promise。然后我们可以使用 .map 而不是 .forEach 来生成一个承诺数组,然后我们可以将其传递给 Promise.all:

function getUsersGroups(users, req) {
  const promises = users.map(function(user) {
    user.groups = []
    return db
      .collection("groups")
      .find({ "users._id": String(user._id) })
      .toArray()
      .then(groups => {
        user.groups = groups
      })
  });

  return Promise.all(promises);
}

请注意,这会改变用户对象。也就是说,无论您传递给函数的 users 将被设置的 groups 字段修改。