【问题标题】:Using Promise.all on my db.collection forEach在我的 db.collection forEach 上使用 Promise.all
【发布时间】:2020-04-24 08:10:15
【问题描述】:

如何使用 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
          });

非常感谢!

【问题讨论】:

标签: javascript node.js es6-promise node-mongodb-native


【解决方案1】:
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;
}

希望对你有帮助

【讨论】:

  • 您好,我如何返回用户?我这样调用函数: docs = getUsersGroups(docs, req);
  • @harmoniuscool 我已经编辑了我的答案。基本上等待所有承诺让它完成然后返回用户。
  • 这个函数怎么调用?
  • await Promise.all(users.map(user => { ^^^^^ SyntaxError: await 仅在异步函数中有效
  • 只需为函数 getUsersGroups 分配async。我已经添加了。
【解决方案2】:

查看toArray 的文档,如果未指定回调,它将返回Promise。然后我们可以使用.map 而不是.forEach 来生成一组promise,然后我们可以将其传递给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 字段。

【讨论】:

  • 非常感谢,您的函数正在运行,但是当我从另一个函数调用它时,getUsersGroups(docs, req);是空的,而 console.log(groups) 表示它在 getUsersGroups() 内部时被填充。
  • 这个函数怎么调用?
  • 我试图这样称呼它:getUsersGroups(docs, req) .then(result => { console.log(result); res.send(result); }) .catch( error => { // 如果你有错误 });没有运气
  • 非常感谢您的出色回答,我终于使用了 Ashish 的答案,并像这样调用函数 getUsersGroups(docs, req) .then(result => { console.log(result ); res.send(result); }) .catch(error => { // 如果你有错误 });但我想你的答案也有效。
猜你喜欢
  • 1970-01-01
  • 2018-08-29
  • 2021-03-21
  • 2018-12-01
  • 2015-10-03
  • 2017-08-20
  • 2020-02-08
  • 2022-01-08
  • 2022-01-03
相关资源
最近更新 更多