0
我正在使用Bluebird來處理承諾,但我很難知道何時完成所有迭代,因此我可以將結果提交給客戶端。Promise.each在藍鳥有一些所有操作完成回調?
到目前爲止,這是我的代碼:
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秒鐘,直到上述所有操作完成,然後將結果發送給客戶端。
我在找一些簡單的東西,我的代碼不會改變很多。
任何人都有這個想法嗎?
閱讀我的回答對您的其他問題:https://stackoverflow.com/questions/36819137/foreach-async-function-in-節點-js/36819772#36819772它部分回答這個問題。 Promise可以使用'then()'來鏈接。在你的情況下,使用bluebird的'each'不是必要的,而且會浪費性能(它會連續處理輸入,而不是同時處理所有請求)。 – Shanoor