Есть ли в 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.');
});