Ich möchte einige Versprechen, die von Diensten zurückgegeben werden, verketten. Dies funktioniert, solange einige der Methoden, die die Versprechen zurückgeben, keine zusätzlichen Parameter erfordern. Dies ist mein Beispiel:AngularJS: Übergeben Sie zusätzliche Parameter zu verketteten Versprechen
var first = function() {
var d = $q.defer();
$timeout(function() {
d.resolve("first resolved")
}, 100)
return d.promise;
};
var second = function(val) {
console.log("value of val: ", val);
var d = $q.defer();
$timeout(function() {
d.resolve("second resolved")
}, 200)
return d.promise;
};
first().then(second).then(function(value) {
console.log("all resolved", value);
});
Dies funktioniert wie erwartet. Aber was, wenn mein Service second
einen zusätzlichen Parameter val
benötigt, um es zu tun? Bei der obigen Methode ist der Wert val
"first resolved"
, weil es den aufgelösten Wert von first
ergibt.
Gibt es eine Möglichkeit, um, ohne anonyme Funktionen wie diese Verschachtelung:
first().then(function() {
return second("foobar").then(function(value) {
console.log("all resolved", value);
});
});
Ich dachte über $q.all
verwenden, aber IMHO können Sie nicht einen Auftrag für Ihre Versprechen geben.
'$ timeout' gibt bereits ein Versprechen, keine Notwendigkeit für ein' $ q.defer'there –
Ich weiß, es war einfach zu Demonstrationszwecken. In meinem Fall habe ich einen http-Aufruf und mache danach eine Verarbeitung mit den Daten. Also brauche ich ein extra '$ q.defer' – 23tux
uhh ... $ http gibt auch schon ein Versprechen zurück und man kann es dann für die extra Verarbeitung verwenden und zurückgeben, dass ... über Code kein Urteil fällen kann Ich habe es nicht gesehen, aber es klingt immer noch wie das verzögerte Anti-Muster. Sie benötigen _ $ q.defer _only_, wenn Sie gegen eine Callback-API arbeiten, wenn Sie sie ankündigen. –