解析不在循环Node.js中工作

时间:2017-02-25 11:53:39

标签: node.js express promise

您好我在运行循环并使用Promises获取返回数据时遇到问题。

我有一种getStudentMarks方法可以在主题方面从数据库中获取学生的分数。

getStudentMarks: function(studentId, studentStandard) {
    console.log("getStudentMarks invoked...");
    return new Promise(function(resolve, reject) {
        r.table('student_subjects').filter({
            "studentId": studentId,
            "studentStandard": studentStandard
        }).pluck("subjectId", "subjectName").run(connection, function(err, cursor) {
            if (err) {
                throw err;
                reject(err);
            } else {
                cursor.toArray(function(err, result) {
                    if (err) {
                        throw err
                    } else {
                        console.log(result.length);
                        if (result.length > 0) {
                            studentSubjectArray = result;

                            var studentMarksSubjectWiseArray = [];
                            studentSubjectArray.forEach(function(elementPhoto) {
                                r.table('student_marks').filter({
                                    "studentId": studentId,
                                    "subjectId": studentSubjectArray.subjectId
                                }).run(connection, function(err, cursor) {
                                    if (err) {
                                        throw err;
                                        reject(err);
                                    } else {
                                        cursor.toArray(function(err, result_marks) {
                                            var studnetMarksDataObject = {
                                                subjectId: studentSubjectArray.subjectId,
                                                subjectName: studentSubjectArray.subjectName,
                                                marks: result.marks
                                            };
                                            studentMarksSubjectWiseArray.push(studnetMarksDataObject);
                                        });
                                    }
                                });
                            });
                            resolve(studentMarksSubjectWiseArray);
                        }
                    }
                });
            }
        });
    });
}

我正在调用方法,

app.post('/getStudentMarks', function(req, reqs) {
    ubm.getStudentMarks(req.body.studentId, req.body.studentStandard)
        .then((data) => {
            console.log('return data: ' + data);
        })
        .catch((err) => {
            console.log(err);
        });
});

当我运行代码时,它的工作非常好,没有错误。我在studentMarksSubjectWiseArray数组中获得了所有学生标记对象。但问题是在studentSubjectArray循环完成之前,解决方案正在执行,我得到一个空白数组作为返回。我该如何解决这个问题。我知道我没有做Promises权利。我是Promises的新手,所以我无法找到正确的方法。

1 个答案:

答案 0 :(得分:0)

这是因为在studentSubjectArray.forEach语句中执行了一组异步操作r.table(...).filter(...).run()并将结果推送到数组中。但是,执行resolve()后,这些操作会完成,因此studentMarksSubjectWiseArray仍为空。在这种情况下,您必须使用Promise.all()方法。

let promisesArray = [];
studentSubjectArray.forEach((elementPhoto) => {
    let singlePromise = new Promise((resolve, reject) => {
        // here perform asynchronous operation and do the resolve with single result like r.table(...).filter(...).run()
        // in the end you would perform resolve(studentMarksDataObject)

        r.table('student_marks').filter({
            "studentId": studentId,
            "subjectId": studentSubjectArray.subjectId
        }).run(connection, function(err, cursor) {
            if (err) {
                throw err;
                reject(err);
            } else {
                cursor.toArray(function(err, result_marks) {
                    var studnetMarksDataObject = {
                        subjectId: studentSubjectArray.subjectId,
                        subjectName: studentSubjectArray.subjectName,
                        marks: result.marks
                    };
                    resolve(studnetMarksDataObject);
                });
            }
        });
    });
    promisesArray.push(singlePromise)
});

Promise.all(promisesArray).then((result) => {
    // here the result would be an array of results from previously performed set of asynchronous operations
});