在下面的代码中,我有一个无限循环,我不知道它为什么会发生。我最好的猜测是因为里面的函数是异步的,循环不会等待它,所以循环永远不会停止。解决这个问题的最佳方法是什么?
for (var i = 0, len = studentsData.length; i < len; i++) {
// (function(i) {
// var p = new Promise(function(resolve, reject) {
// var item = studentsData[i];
// Find student
Student.findOne({
email: item.Email
},
function (err, student) {
if (err) {
reject(err);
} else {
if (!student) {
// Create Student.
var StudentObj = {
firstName: item.Name || null,
lastName: null,
contact: item.Mobile || null,
securityToken: UTIL.randomString(21),
email: item.Email
};
Student.create(StudentObj, function (err, newStudent) {
if (err) {
reject(err);
} else {
// return newStudent;
console.log("Student created with Id=", newStudent._id);
// resolve(newStudent);
}
});
}
}
}
);
//});
// studentPromise.push(p);
// })(i);
}**
答案 0 :(得分:0)
如果不知道studentsData
变量是什么,我会说i
总是小于studentsData
。
你让自己变得非常复杂,试图在for循环中运行一个回调函数。
我倾向于使用承诺重写这一点,并使用promise.all
立即调用所有承诺。你可以这样做:
function findOrCreateStudent(item){
// push all promises into an array called promises
const promises = studentsData.map(async (studentData) => {
// first param is your query, second is the object of the new document you want to create
try {
return await Student.findOrCreate({email: item.Email}, studentData) // I'm assuming studentsData is an array of student objects you want to find or create
}catch(err){
console.log(`Unable to find or create studen ${err}`)
}
})
return Promise.all(promises) // call all promises
}