Ich möchte eine for-Schleife haben, die bei jeder Iteration asynchrone Funktionen aufruft.
Nach der for-Schleife möchte ich einen weiteren Codeblock ausführen, aber nicht bevor alle vorherigen Aufrufe in der for-Schleife aufgelöst wurden.
Mein Problem im Moment ist, dass entweder der Codeblock nach der for-Schleife ausgeführt wird, bevor alle asynchronen Aufrufe beendet sind, oder dass er überhaupt nicht ausgeführt wird.
Der Codeteil mit der FOR-Schleife und dem Codeblock danach (den vollständigen Code finden Sie unter Geige ):
[..]
function outerFunction($q, $scope) {
var defer = $q.defer();
readSome($q,$scope).then(function() {
var promise = writeSome($q, $scope.testArray[0])
for (var i=1; i < $scope.testArray.length; i++) {
promise = promise.then(
angular.bind(null, writeSome, $q, $scope.testArray[i])
);
}
// this must not be called before all calls in for-loop have finished
promise = promise.then(function() {
return writeSome($q, "finish").then(function() {
console.log("resolve");
// resolving here after everything has been done, yey!
defer.resolve();
});
});
});
return defer.promise;
}
Ich habe eine jsFiddle erstellt, die hier zu finden ist: http://jsfiddle.net/riemersebastian/B43u6/3/ .
Im Moment sieht es so aus, als ob die Ausführungsreihenfolge in Ordnung ist (siehe Konsolenausgabe).
Ich vermute, das liegt einfach daran, dass jeder Funktionsaufruf sofort zurückkehrt, ohne echte Arbeit zu leisten. Ich habe versucht, die defer.resolve mit setTimeout zu verzögern, bin jedoch fehlgeschlagen (dh der letzte Codeblock wurde nie ausgeführt). Sie können es im auskommentierten Block in der Geige sehen.
Wenn ich die realen Funktionen verwende, die in eine Datei schreiben und aus einer Datei lesen, wird der letzte Codeblock ausgeführt, bevor der letzte Schreibvorgang abgeschlossen ist, was ich nicht möchte.
Natürlich könnte der Fehler in einer dieser Lese- / Schreibfunktionen liegen, aber ich möchte überprüfen, ob mit dem hier veröffentlichten Code nichts falsch ist.