我正在使用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秒,直到完成上述所有操作,然后将结果发送给客户端。
我正在寻找简单的东西以及我的代码不会改变的东西。
有人对此有任何想法吗?
答案 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.');
});