Как вернуть массив в качестве вывода после выполнения forEach l oop? - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть массив, в котором проект _id хранится в коллекции user . Сначала я выбираю этот массив, а затем пытаюсь получить данные, соответствующие _id (хранящемуся в пользовательской коллекции), хранящемуся, если projects collection. Полученные данные помещаются в массив, и этот массив возвращается в качестве вывода. Но я не могу этого сделать. Пустой массив возвращается.

var projectInfo= new Array();

users.post('/retrieveProjects', function(user, res, next) { 
  MongoClient.connect(url, function(err,db) {
    if (err) throw err;
    var dbo = db.db("EMWorks");
    dbo.collection("users").findOne({_id:user.body.userid})
    .then(response => {
      if(response)
      {
        console.log(response);
        (response.project).forEach(element => {
          dbo.collection("projects").findOne({_id:element})
          .then(respo => {
            console.log(respo);
            projectInfo.push(respo);
          });
          console.log(projectInfo) ;
        });

      }else{
        console.log("No Projects created yet...!");
      }
    });
  });
});

Вывод кода

1 Ответ

0 голосов
/ 09 февраля 2020

Проблема в том, что dbo.collection("projects").findOne является асинхронным c и возвращает обещание. ForEach l oop запускается и генерирует эти обещания для каждого элемента, но не ожидает его выполнения. Обещания не разрешаются, когда l oop заканчивается и возвращается пустой массив. Вы можете дождаться выполнения обещаний и вернуть массив только после этого:

const promises = [];
(response.project).forEach(element => {
      promises.push(dbo.collection("projects").findOne({_id:element})
      .then(respo => {
        console.log(respo);
        projectInfo.push(respo);
      });
    }));
   Promise.all(promises).then(function(values) {
      console.log(projectInfo) ;
 });

Это также можно упростить с помощью функции map и async / await:

const promises = (response.project).map(async element => {
      const respo  = await dbo.collection("projects").findOne({_id:element});
      projectInfo.push(respo);
    });
   Promise.all(promises).then(function(values) {
      console.log(projectInfo) ;
 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...