Bluebird 中的 Promise.each 是否有某种所有操作完成的回调?
Does Promise.each in Bluebird has some kind of all operations finished callback?
我正在使用 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秒的超时时间,直到上面的所有操作都完成,然后将结果发送给客户端。
我正在寻找一些简单且我的代码不会改变太多的东西。
有人对此有任何想法吗?
按照doc here、Promise.eachreturns的承诺。
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.');
});
我正在使用 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秒的超时时间,直到上面的所有操作都完成,然后将结果发送给客户端。
我正在寻找一些简单且我的代码不会改变太多的东西。
有人对此有任何想法吗?
按照doc here、Promise.eachreturns的承诺。
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.');
});