javascript - 无法在循环外访问数组元素

标签 javascript arrays node.js asynchronous

我在 Node js 和 Express 中有这个端点,它将学生添加到数组中。我在请求正文中传递了类名称和一组电子邮件。逻辑如下:

  • 使用传递的类名搜索该类是否存在。如果该类存在,则遍历电子邮件数组,搜索具有该电子邮件的用户是否存在并具有 Angular 色成员。如果它们满足,则将它们添加到数组中。

问题:

  • 当我尝试在循环内控制台记录数组时,它显示学生对象已添加到数组中。但是,当在循环之外时,我在 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
   })

有人帮忙吗?

最佳答案

因为当您注销学生时,您的代码可能仍在添加学生,请参阅此代码

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 并启动非同步操作(promise)时,它不会等待执行完成,而是直接进入 console.log 语句。

关于javascript - 无法在循环外访问数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55263807/

相关文章:

javascript - 绘制指向 d3 圆形包布局的链接

javascript - 允许在 javascript 中添加一位或两位数的时间

javascript - Rails 应用程序中的无限滚动

php - AJAX 未将数据传递给 php

node.js - 用Node.js可以做大型项目吗

java - 我不知道如何将 Jbutton 返回到调用它的前一个方法

python - 如何获取 boolean numpy 数组和另一个 boolean 数组的相对补集?

c++ - 如何将内存分配给大小为 10^9 的二维数组

node.js - Electron :在主进程中使用模块

javascript - 需要帮助在日语中格式化 MomentJS 中的日期