Javascript 无法访问循环外部的数组元素
我在NodeJS和express中有一个端点,它将学生添加到数组中。我在请求主体中传递类名和一系列电子邮件。逻辑如下:Javascript 无法访问循环外部的数组元素,javascript,arrays,node.js,asynchronous,Javascript,Arrays,Node.js,Asynchronous,我在NodeJS和express中有一个端点,它将学生添加到数组中。我在请求主体中传递类名和一系列电子邮件。逻辑如下: 使用传递的类名搜索该类是否存在。如果该类存在,则遍历电子邮件数组,搜索具有该电子邮件的用户是否存在以及是否具有角色成员。如果它们满足此条件,则将它们添加到数组中 问题是: 当我尝试在循环中对数组进行控制台日志记录时,它显示student对象已添加到数组中。但是,在循环之外时,我在console.log上得到一个空数组 下面是我试图描述的实际代码: const findC
- 使用传递的类名搜索该类是否存在。如果该类存在,则遍历电子邮件数组,搜索具有该电子邮件的用户是否存在以及是否具有角色成员。如果它们满足此条件,则将它们添加到数组中李>
- 当我尝试在循环中对数组进行控制台日志记录时,它显示student对象已添加到数组中。但是,在循环之外时,我在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);
}));
})
我所做的是,我删除了你的控制台。日志
并将其与第二个链接,然后
从第一个链接,然后
返回学生数组
在javascript中,回调是非阻塞的,即它们不会阻塞执行序列,控制将转到下一个语句。当您声明
studentsArray
并启动非同步操作(promise)时,它没有等待执行完成,而是直接转到console.log
语句 您的代码是异步的,第二个console.log(studentArray)
被称为firsts(在异步请求完成之前)。您可以访问中的文件数组。然后
。或者您可以尝试使用async
谢谢@Pvl。在Umair Abid制作senseThanks。这很有道理,为我工作