2014-07-23 2 views
7

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.

+0

'$ timeout' gibt bereits ein Versprechen, keine Notwendigkeit für ein' $ q.defer'there –

+0

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

+0

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. –

Antwort

10

Natürlich. Erste Möglichkeit:

first() 
    .then(function() { 
    return second("foobar"); 
    }) 
    .then(function(value) { 
    console.log("all resolved", value); 
    }); 

Sekunde (viel einfacher) Art und Weise:

first() 
    .then(second.bind(null, "foobar")) 
    .then(function(value) { 
    console.log("all resolved", value); 
    }); 
+0

funktioniert wie ein Charme! Vielen Dank! – 23tux

+0

Gern geschehen. Wichtig ist, dass man sich immer daran erinnert, dass die Funktion nur durch das Versprechen aufgerufen werden kann. Wenn Sie also zusätzliche Parameter benötigen oder etwas mit einem bestimmten Wert tun müssen, müssen Sie es umbrechen oder binden und eine einfache Funktion an den 'then'-Aufruf übergeben. Und dann kann die Funktion ein anderes Versprechen abgeben. – Razem