Есть ли в Promise.each в 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 ответ

Решение

Согласно документу, 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.');
});
Другие вопросы по тегам