2016-04-24 58 views
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秒鐘,直到上述所有操作完成,然後將結果發送給客戶端。

我在找一些簡單的東西,我的代碼不會改變很多。

任何人都有這個想法嗎?

+2

閱讀我的回答對您的其他問題:https://stackoverflow.com/questions/36819137/foreach-async-function-in-節點-js/36819772#36819772它部分回答這個問題。 Promise可以使用'then()'來鏈接。在你的情況下,使用bluebird的'each'不是必要的,而且會浪費性能(它會連續處理輸入,而不是同時處理所有請求)。 – Shanoor

回答

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.'); 
}); 
相關問題