Warten Sie, bis alle Versprechen zu lösen
Also ich habe eine situation, wo ich mehrere Versprechen Ketten von einer Länge unbekannt ist. Ich möchte eine Aktion ausführen, 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 verspricht eins, zwei, und drei, die aufgelöst wird zu einem zufälligen Zeitpunkt. Ich habe dann fügen Sie verspricht, auf die enden der eins und drei. Ich will die all
zu lösen, wenn alle Ketten wurden gelöst. 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?
InformationsquelleAutor jensengar | 2014-02-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sicher sind, dann geben Sie einfach die Versprechen jede Kette in die
all()
statt der ersten verspricht:Was ist das problem? Sind Ihre Ketten dynamisch aufgebaut?
Genau mein problem. Ich bin versucht, um dynamisch erstellen Sie ein Versprechen Kette dann will ich etwas tun, wenn die Kette(s) abgeschlossen.
Können Sie uns zeigen, Ihren code (vielleicht eine neue Frage stellen)? Gibt es Gegenstände, die an die Kette, nachdem
Q.all
ausgeführt wurde - ansonsten sollte es trivial sein?Ich würde lieben, Ihnen zu zeigen, der code... aber ich habe nicht mit dem schreiben fertig ist es noch nicht, aber ich werde mein bestes tun, um es zu erklären. Ich habe eine Liste von "Maßnahmen", die getan werden müssen. Diese Aktionen können beliebig viele Ebenen von sub-Handlungen, die mit Ihnen verbunden sind. Ich möchte in der Lage sein, etwas zu tun, wenn alle Maßnahmen und Ihre subactions abgeschlossen sind. Es wird wahrscheinlich mehrere
$q.all
s, aber sobald ich anfange Prozess der Auflösung, keine neuen Aktionen/verspricht verkettet werden.InformationsquelleAutor Bergi
Den akzeptierte Antwort korrekt ist. Ich möchte ein Beispiel geben zu erarbeiten, die es ein bisschen um diejenigen, die nicht vertraut mit
promise
.Beispiel:
In meinem Beispiel habe ich ersetzen müssen, die
src
Attributeimg
tags mit unterschiedlichen Spiegel-urls falls vorhanden, bevor das rendering der Inhalte.Erklärung:
Von AngularJS docs:
Den
then
Methode:$q.alle(Versprechen)
Den
promises
param kann eine Reihe von Versprechungen.Über
bind()
Mehr info hier: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bindthen
Methode der$q.all
ist ein array mit den zurückgegebenen verspricht, so können Sie mit einer Schleife das array und callthen
auf jedes Element im array, im Gegensatz zum Aufrufthen
wenn Sie das Versprechenpromise_array
.InformationsquelleAutor Hieu
Hatte vor kurzem dieses problem, aber mit unbekannten Zahl von Versprechungen.Gelöst mit jQuery.anzeigen().
Es ist nicht jQuery.map (), aber Array.der Prototyp.map () - (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...), aber dieses Konzept funktioniert.
InformationsquelleAutor SoniCue
Gibt es einen Weg.
$q.all(...
Können Sie die unten Stoffe:
http://jsfiddle.net/ThomasBurleson/QqKuk/
http://denisonluz.com/blog/index.php/2013/10/06/angularjs-returning-multiple-promises-at-once-with-q-all/
$q.all([p1.then(..).then(...).then(...).then(...) ...]);
Recht?InformationsquelleAutor Nikola Yovchev