Использование Promise.all на моем db.collection forEach - PullRequest
0 голосов
/ 06 января 2020

Как я могу использовать 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

Редактировать:

Итак, наконец, я использую эту функцию, как сказал Аши sh (она получает все группы, в которых находится пользователь, и обновляет модель пользователей):

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

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 06 января 2020

Глядя на документацию для toArray, он возвращает 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.

0 голосов
/ 06 января 2020
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;
}

Надеюсь, это поможет

...