2016-04-24 1 views
0

Ich benutze Bluebird, um Versprechen zu halten, aber ich habe Schwierigkeiten zu wissen, wenn alle Iterationen abgeschlossen sind, so kann ich das Ergebnis zurück an den Client senden.Hat Promise.each in Bluebird eine Art aller Operationen beendet Callback?

Bisher dies ist mein Code:

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); 

Wie Sie oben aus dem Code sehen können, ich bin ein Timeout für 5 Sekunden, bis alle oben beschriebenen Vorgänge beendet sind und dann schicken Sie das Ergebnis an den Client Einstellung .

Ich bin auf der Suche nach etwas Einfaches und etwas, das mein Code nicht viel ändern wird.

Hat jemand eine Idee dafür?

+2

meine Antwort auf Ihre andere Frage lesen: https://stackoverflow.com/questions/36819137/foreach-async-function-in- node-js/36819772 # 36819772 Es antwortet teilweise darauf. Versprechen sind mit 'then()' verkettbar. In Ihrem Fall ist die Verwendung von "each" von bluebird nicht notwendig und eine Verschwendung von Leistung (es verarbeitet die Eingabe seriell, anstatt alle Anfragen gleichzeitig auszuführen). – Shanoor

Antwort

0

Laut der doc here gibt Promise.each eine Zusage.

Promise.each(
    Iterable<any>|Promise<Iterable<any>> input, 
    function(any item, int index, int length) iterator 
) -> Promise 

Also, ich denke, dies zu tun:

Promise.each(students, function (student) { 
    .... 
}).then(function(){ 
    //all done 
    res.json(arrayReports); 
    console.log('finished.'); 
}); 
Verwandte Themen