Мой обратный вызов не ведет себя как ожидаемый узел js - PullRequest
0 голосов
/ 26 декабря 2018

что я пытаюсь сделать, так это сначала собрать всех учеников определенного класса и класса из коллекции учеников.Затем, используя идентификаторы учеников из запрошенного класса и класса, найдите оценки, используя идентификаторы учеников из коллекции меток, используя mongoose

, вот моя схема ученика

const StudentSchema = new Schema({
    base_no:{
        type: String,
        required: true 
    },
grade: {
        type: Number,
        required: false
    },
    class: {
        type: String,
        required: false
    }

});

const Student = module.exports = mongoose.model('student',StudentSchema,'student');

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

/**
 *  Get all students of a class for a given grade
 * 
 */
module.exports.getStudentsGradeClass = function(params,callback){
    Student.find({grade: params.grade, class: params.class},'base_no first_name last_name').sort({base_no: 1}).exec(callback);
}

Вот моя схема оценки

 const MarksSchema = new Schema({

        verifire: {
            type: String,
            required: true,
            //index:true
        },
        student_base_id: { // as student auto gen key/index no
            type: String,
            required: true,
            //index:true
        },
        subject_id: {
            type: String,
            required: true,
            ref: 'subject',
            //index:true
        },
        total: {
            type: Number,
            required: true
        }
    });


    const Marks = module.exports = mongoose.model('school_marks', MarksSchema, 'school_marks');

Поэтому я используюПриведенный выше метод getStudentsGradeClass () схемы ученика позволяет получить запрошенные ученики со стороны клиента, а затем получить оценки из схемы Marks, используя идентификаторы ученика из метода getStudentsGradeClass (), используя этот код

    /**
         *  Get marks of all students of the requested grade->class with subject_id
         * 
         */
        module.exports.getClassResults = function (params, callback) {
            let marks = [];
            Student.getStudentsGradeClass({ grade: params.grade, class: params.class }, (err, students) => {
                if (!err) {
                    for (let i = 0; i < students.length; i++) {
                        Marks.find({ subject_id: params.subject_id, student_base_id: students[i].base_no }, 'student_base_id total', (err, data) => {
                            if (!err) {
                                marks.push(data[0]);
                            } else {
                                callback(err, null);
                            }
                        });
                    }
                    callback(null,marks); // this is the function I wan to invoke
                                          // right after the for loop finishes so 
                                          // that i can get all marks of all 
                                          //students for a specific subject..   


    // currently it is undefined(marks[]) coz it goes straight for the callback 
     //  giving control to the for loop, the for loop gives data much later so that 
    // marks are not pushed to the array when I call it.

                } else {
                    callback(err, null);
                }

            });
        }

Я делаю это таким образом (я знаю, что я в пирамиде гибели).Пожалуйста, предложите мне более чистый способ сделать это, или вы можете помочь мне преодолеть это или как достичь цели, которую я пытаюсь достичь.Любая помощь очень ценится.

1 Ответ

0 голосов
/ 26 декабря 2018

вы можете попробовать с async / await ...........

 module.exports.getClassResults =  (params, callback)=> {
            let marks = [];
            Student.getStudentsGradeClass({ grade: params.grade, class: params.class },async (err, students) => {
                if (!err) {

                 for (let student of students){
                      let data=await Marks.find({ subject_id: params.subject_id, student_base_id: student.base_no }, 'student_base_id total')
                            if (data) {
                                marks.push(data[0]);

                            } else {
                                callback(err, null);
                            }

                    }
                    callback(null,marks); // this is the function I wan to invoke
                                          // right after the for loop finishes so 
                                          // that i can get all marks of all 
                                          //students for a specific subject..   


    // currently it is undefined(marks[]) coz it goes straight for the callback 
     //  giving control to the for loop, the for loop gives data much later so that 
    // marks are not pushed to the array when I call it.

                } else {
                    callback(err, null);
                }

            });
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...