Ich habe also eine Situation, in der ich mehrere Versprechensketten unbekannter Länge habe. Ich möchte, dass eine Aktion ausgeführt wird, wenn alle KETTEN verarbeitet wurden. Ist das überhaupt möglich? Hier ist ein Beispiel:
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 habe ich ein $q.all()
für Versprechen eins, zwei und drei eingerichtet, die zu einem zufälligen Zeitpunkt aufgelöst werden. Ich füge dann Versprechen an die Enden von eins und drei hinzu. Ich möchte, dass das aufgelöst wird all
, wenn alle Ketten aufgelöst wurden. Hier ist die Ausgabe, wenn ich diesen Code ausführe:
one done
one doneChained
two done
three done
ALL PROMISES RESOLVED
three doneChained
three doneChainedChained
Gibt es eine Möglichkeit zu warten, bis sich die Ketten aufgelöst haben?
quelle
Q.all
der Ausführung an die Kette angehängt wurden - ansonsten sollte es trivial sein?$q.all
s geben, aber sobald ich den Lösungsprozess starte, werden keine neuen Aktionen / Versprechen verkettet.Die akzeptierte Antwort ist richtig. Ich möchte ein Beispiel geben, um es denjenigen näher zu bringen, die nicht damit vertraut sind
promise
.Beispiel:
In meinem Beispiel muss ich die
src
Attribute vonimg
Tags durch verschiedene Spiegel-URLs ersetzen, falls verfügbar, bevor der Inhalt gerendert wird.Erläuterung:
Aus AngularJS- Dokumenten :
Die
then
Methode:$ q.all (verspricht)
Der
promises
Parameter kann eine Reihe von Versprechungen sein.Über
bind()
Mehr Infos hier: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bindquelle
then
Methode von$q.all
wird mit einem Array der zurückgegebenen Versprechen bereitgestellt, sodass Sie dieses Array in einer Schleife ausführen undthen
jedes Element im Array aufrufen können, anstattthen
beim Hinzufügen des Versprechens aufzurufenpromise_array
.Hatte kürzlich dieses Problem aber mit unbekannter Anzahl von Versprechungen. Mit jQuery.map () gelöst .
quelle
Da ist ein Weg.
$q.all(...
Sie können die folgenden Dinge überprüfen:
http://jsfiddle.net/ThomasBurleson/QqKuk/
http://denisonluz.com/blog/index.php/2013/10/06/angularjs-returning-multiple-promises-at-once-with-q-all/
quelle
$q.all([p1.then(..).then(...).then(...).then(...) ...]);
richtig machen?Sie können "warten" in einer "asynchronen Funktion" verwenden .
HINWEIS: Ich bin nicht 100% sicher, ob Sie eine asynchrone Funktion von einer nicht asynchronen Funktion aus aufrufen und die richtigen Ergebnisse erzielen können.
Das heißt, dies würde niemals auf einer Website verwendet werden. Aber für Lasttests / Integrationstests ... vielleicht.
Beispielcode:
quelle