Promise.每个在蓝鸟都有某种所有操作完成的回调吗?

Does Promise.each in Bluebird has some kind of all operations finished callback?

本文关键字:操作 回调 蓝鸟 Promise      更新时间:2023-09-26

我正在使用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 秒,直到上述所有操作完成,然后将结果发送到客户端。

我正在寻找一些简单的东西,我的代码不会改变太多。

有人对此有任何想法吗?

根据这里的文档,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.');
});