mit async korrekt (mit forEach)
So, ich habe einen schönen Batzen geschachtelte async-code zusammen läuft und es scheint alles in Ordnung zu sein, außer für mich, wenn ich das Ende. meine Letzte Funktion in einer Serie block ist eine forEach: das geht dann in eine async.parallel
Gelungen, auf die Spur des folgenden chunks, die nicht in Ordnung:
async.forEach(array, function(elem, callback) {
async.parallel([
function(callback) {
database-call-A(elem, unction(err, data) {
if(err){
console.log("error on first parallel");
callback({err: false}); //will break out
} else {
elem.c = data;
callback();
}
});
},
function(callback) {
database-call-B(elem, function(err, data) {
if(err){
console.log("error on first parallel");
callback({err: false}); //will break out
} else {
elem.c = data;
callback();
}
});
}
]); //end async.parallel
//if forEach needs a callback after every iteration (which I think it does?)
console.log("PRINTS N TIMES - ONCE FOR EVERY ITERATION");
callback(); //both parallel functions have run, call back forEach
}); //end forEach
console.log("Donions - prints when finished");
Wenn ich getestet, diese code durch das werfen von print-Anweisungen überall, ich habe bemerkt, dass "DRUCKE N-MAL ..." lief N-mal, dann hab ich "Donions .." und DANN mein tun etwas(); und andere Sachen(); Schritte erste genannte in meiner async.parallel.
Warum ist meine forEach Durchlaufen ohne zu warten, für die Rückrufe von async.parallel?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstens, es gibt keine
async.forEach
, aber es ist dieasync.each
Funktion. Dieasync.parallel
Funktion führen Sie alle Aufgaben simoultaneously und führen Sie dann den Rückruf, sofern Sie definiert wurde.In Ihre Quelle, die
callback
- Funktion wird ausgeführt, sobald dieasync.parallel
ausgeführt wird, nicht nach allen seinen Funktionen zurück. Ich schlage vor, Sie Lesen die Dokumentation.Wenn Sie möchten, führen Sie die
callback
nach all den parallelen Funktionen " Rückrufe wurden aufgerufen, Sie sollten vergehen, dieforEach
's Rückruf derasync.parallel
Funktion als zweiten parameter, nachdem Sie das array von Funktionen. Auch, sollten Sie sich wahrscheinlich übergeben, die Rückrufe zu beidendatabaseCallA
unddatabaseCallB
damit rufen Sie Ihre Rückrufe, wenn Sie fertig sind, so dass Sie nicht ausgeführt vorzeitig.Bearbeiten Sie Ihre Datenbank-Funktionen aufrufen zu akzeptieren, die callback-argument und machen Sie den Aufruf der callback-nachdem Sie Ihre Arbeit getan.
Den Punkt der asynchronen Aufrufe wird kostenlos die Ressourcen für andere Tätigkeiten während der Wartezeit für Ihre Aufgabe zu beenden - Ihr code wird weiterhin, es ist die Ausführung, aber Sie können die Rückrufe oder irgendeine Art von Ereignis-basierte Benachrichtigungen, die anderen die asynchrone Aufgabe abgeschlossen ist.
BEARBEITEN
Ausführen etwas, nachdem alle parallelen Anrufe beendet haben:
Note, that since this (each) function applies the iterator to each item in parallel, there is no guarantee that the iterator functions will complete in order.
Sie könnten versuchen, miteachSeries
.Ich bin mir nicht sicher, für diese Antwort, aber laut mit async-Dokumentation, ich glaube, Sie müssen dies tun :
Grüße.