So habe ich eine Situation, wo ich mehrere Versprechen Ketten einer unbekannten Länge haben. Ich möchte eine Aktion ausführen, wenn alle Ketten verarbeitet wurden. Ist das überhaupt möglich? Hier ein Beispiel:Warte auf alle Versprechungen zu lösen
app.controller('MainCtrl', function($scope, $q, $timeout) {
var one = $q.defer();
var two = $q.defer();
var three = $q.defer();
var all = $q.all([one.promise, two.promise, three.promise]);
all.then(allSuccess);
function success(data) {
console.log(data);
return data + "Chained";
}
function allSuccess(){
console.log("ALL PROMISES RESOLVED")
}
one.promise.then(success).then(success);
two.promise.then(success);
three.promise.then(success).then(success).then(success);
$timeout(function() {
one.resolve("one done");
}, Math.random() * 1000);
$timeout(function() {
two.resolve("two done");
}, Math.random() * 1000);
$timeout(function() {
three.resolve("three done");
}, Math.random() * 1000);
});
In diesem Beispiel stellte ich einen $q.all()
für Versprechungen ein, zwei und drei, die an einigen zufälligen Zeit gelöst bekommen wird. Ich füge dann Versprechen zu den Enden von eins und drei hinzu. Ich möchte die all
auflösen, wenn alle Ketten aufgelöst worden sind. Hier ist die Ausgabe, wenn ich diesen Code ausführen:
one done
one doneChained
two done
three done
ALL PROMISES RESOLVED
three doneChained
three doneChainedChained
Gibt es eine Möglichkeit zu warten, bis die Ketten zu lösen?
Danke für die Bestätigung meiner schlimmsten Angst. Jetzt muss ich einen Weg finden, um das letzte Versprechen zu bekommen, lol. –
Was ist das Problem damit? Sind Ihre Ketten dynamisch aufgebaut? – Bergi
Genau mein Problem. Ich versuche dynamisch eine Versprechenskette zu erstellen, dann möchte ich etwas tun, wenn die Kette (n) fertig sind. –