2016-04-24 9 views
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秒間のタイムアウトを設定して、クライアントに結果を送信しています。

私は単純で何かを探していますが、私のコードは変更されません。

誰もがこれについて考えていますか?

+2

があなたの他の質問に私の答えを読みます:https://stackoverflow.com/questions/36819137/foreach-async-function-in- node-js/36819772#36819772部分的にこれに答えます。約束は 'then()'を使って連鎖可能です。あなたの場合、ブルーバードの「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.'); 
}); 
関連する問題