0
私は約束を処理するためにBluebirdを使用していますが、すべての反復が終了した時点を知ることが困難なため、結果をクライアントに返すことができます。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- node-js/36819772#36819772部分的にこれに答えます。約束は 'then()'を使って連鎖可能です。あなたの場合、ブルーバードの「each」を使用する必要はなく、パフォーマンスが浪費されます(同時にすべての要求を処理するのではなく、入力を連続的に処理します)。 – Shanoor