Не удается получить доступ к элементам массива вне цикла - PullRequest
0 голосов
/ 20 марта 2019

У меня есть эта конечная точка в узле js и express, которая добавляет студентов в массив.Я передаю имя класса и массив писем в теле запроса.Логика выглядит следующим образом:

  • Поиск, существует ли класс, используя переданное имя класса.Если класс существует, выполните итерацию по массиву писем, ища, существует ли пользователь с таким письмом и имеет ли он роль участника.Если они это удовлетворяют, то добавьте их в массив.

Проблема:

  • Когда я пытаюсь записать в журнал массив внутри цикла, он показывает, что объект студента был добавлен в массив.Однако, находясь вне цикла, я получаю пустой массив в console.log

Вот фактический код, который я пытаюсь описать:

const findClass = LessonClass.findOne({className: req.body.className}).exec();
findClass.then(classObject => {
       // check that each emails exists and has role member
       const studentArray = [];
       const emailBody = req.body.email;
       emailBody.forEach(email => User.findOne({email}).exec().then(userObject => {
           if(userObject.role !== 'member'){
               return res.status(400).send({
                   error: 'Only users with role member can be added to a class as students'
               });
           }
           const student = {
               email: userObject.email,
               studentName: userObject.firstName + ' '+ userObject.lastName
           };
           // add the student to the student array
           studentArray.push(student);
           console.log(studentArray); // returns student object inside array
       })
           .catch(err => {
               console.log(err);
           }));
         console.log(studentArray) //returns empty array
   })

Кто-нибудь поможет?

1 Ответ

0 голосов
/ 20 марта 2019

Поскольку ваш код все еще добавляет учеников, когда вы их вышли, посмотрите этот код

const findClass = LessonClass.findOne({ className: req.body.className}).exec();
findClass.then(classObject => {
  // check that each emails exists and has role member
  const studentArray = [];
  const emailBody = req.body.email;
  emailBody.forEach(email => User.findOne({email}).exec()
    .then(userObject => {
      if (userObject.role !== 'member') {
        return res.status(400).send({
          error: 'Only users with role member can be added to a class as students'
        });
      }
      const student = {
        email: userObject.email,
        studentName: userObject.firstName + ' ' + userObject.lastName
      };
      // add the student to the student array
      studentArray.push(student);
      console.log(studentArray); // returns student object inside array
      return studentArray;
    })
    .then(students => {
      console.log(students);
    }));
})

Что я сделал, я удалил ваш console.log и связал его со вторым then иваш первый then вернул массив студентов.

В javascript обратные вызовы не блокируют, то есть они не будут блокировать последовательность выполнения, и управление перейдет к следующим операторам.Когда вы объявили studentsArray и инициировали несинхронизирующую операцию (обещание), он не дождался завершения выполнения и сразу перешел к оператору console.log.

...