Bluebird中的Promise.each是否有某种所有操作完成回调?

时间:2016-04-24 05:49:04

标签: javascript node.js mongoose promise bluebird

我正在使用Bluebird来处理承诺,但我很难知道所有迭代何时完成,所以我可以将结果提交给客户。

到目前为止,这是我的代码:

 Student.find({ status: 'student' })
    .populate('student')
    .exec(function (err, students) {
        if (err) {
            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });
        }
        Promise.each(students, function (student) {
            // console.log(student.id);
            return WorksnapsTimeEntry.find({ "student": student.id })
                .then(function (doc) {
                    var totalMinutes = 0;
                    var totalAvgLevelActivity = 0;
                    var counter = 0;
                    _.forEach(doc, function (item) {
                        if (item.timeEntries.duration_in_minutes) {
                            totalMinutes = totalMinutes + parseFloat(item.timeEntries.duration_in_minutes[0]);
                        }

                        if (item.timeEntries.activity_level) {
                            totalAvgLevelActivity = totalAvgLevelActivity + parseFloat(item.timeEntries.activity_level[0]);
                            counter++;
                        }
                    });

                    var obj = {};
                    obj.studentId = student.id;
                    obj.firstName = student.firstName;
                    obj.lastName = student.lastName;
                    obj.municipality = student.municipality;
                    obj.totalMinutes = totalMinutes;
                    obj.totalAvgLevelActivity = totalAvgLevelActivity / counter;
                    arrayReports.push(obj);
                })
        });
    });
    setTimeout(function () {
        res.json(arrayReports);
        console.log('finished.');
    }, 5000);

从上面的代码中可以看出,我将设置超时5秒,直到完成上述所有操作,然后将结果发送给客户端。

我正在寻找简单的东西以及我的代码不会改变的东西。

有人对此有任何想法吗?

1 个答案:

答案 0 :(得分:0)

根据doc here,Promise.each返回一个承诺。

Promise.each(
    Iterable<any>|Promise<Iterable<any>> input,
    function(any item, int index, int length) iterator
) -> Promise

所以,我想你可以这样做:

Promise.each(students, function (student) {
     ....
}).then(function(){
    //all done 
    res.json(arrayReports);
    console.log('finished.');
});