如何同步执行findOne&在foreach Loop中创建?

时间:2018-04-12 10:52:50

标签: node.js mongoose

在下面的代码中,我有一个无限循环,我不知道它为什么会发生。我最好的猜测是因为里面的函数是异步的,循环不会等待它,所以循环永远不会停止。解决这个问题的最佳方法是什么?

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);
}**

1 个答案:

答案 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
}