2013-11-23 10 views
5

Ich habe den folgenden Code:Wie kann ich auf das Ergebnis des vorherigen Versprechens in der AngularJS-Versprechungskette zugreifen?

authService.authenticate() 
.then(function (user) { 
    return Task.all({user: user}) 
}) 
.then(function (tasks) { 
    // How to access user object here? 
}) 

Gibt es eine eingebaute Möglichkeit, user Objekt in die zweite then Funktion ohne so etwas wie dies zu tun zu passieren:

var user2 = null; 
authService.authenticate() 
.then(function (user) { 
    user2 = user 
    return Task.all({user: user}) 
}) 
.then(function (tasks) { 
    // Use user2 here 
}) 

oder dies:

authService.authenticate() 
.then(function (user) { 
    var defer = $q.defer() 
    Task.all({user: user}).then(function (tasks) { 
    return defer.resolve(user, tasks) 
    }) 
    return defer.promise 
}) 
.then(function (user, tasks) { 
    // Use user2 here 
}) 

oder verschachteln sie durch den Aufruf der zweiten then direkt auf Task.all (auf diese Weise hätte ich user Objekt über Verschluss verfügbar)? Verschachtelung ist genau das, was ich vermeiden möchte.

Antwort

2

können Sie setzen die dann im Rahmen wo Benutzer noch zugänglich ist (Schließungen überprüfen)

authService.authenticate() 
.then(function (user) { 
    Task.all({user: user}) 
    .then(function (tasks) { 
    // How to access user object here? 
    }) 
}) 

Von Kriskowal der Q documentation selbst, beide Stile gleichwertig sind. Winkel des $q basiert auf Q

Der einzige Unterschied ist Verschachtelung. Es ist nützlich, Handler zu verschachteln, wenn Sie mehrere Eingabewerte in Ihrem Closure erfassen müssen.

+0

Danke, aber das ist der dritte Fall war ich etwa in meiner Frage sprechen - Verschachtelung sie :) Ich versuche es zu vermeiden, weil ich gerade einen vereinfachten Fall gezeigt habe - im echten Code gibt es ein paar mehr Versprechungen, also wäre das Verschachteln genauso wie das Verwenden von Rückrufen. – szimek

+0

hmm ... ja, du hast Recht. Die Sache ist, dass ich diesen verschachtelten Stil in meinem Code verwende und der Code wirklich sehr groß ist ... Die Verschachtelungstiefe ist nicht wirklich so groß. Außerdem hilft die Coffeescript-Syntax sehr;) –

+0

Ich benutze CoffeeScript auch, also werde ich versuchen, sie zu verschachteln und zu sehen, wie es aussieht. Obwohl ich mir nicht ganz sicher bin, wie die Fehlerbehandlung im Falle verschachtelter Versprechen funktioniert ... – szimek

1

Könnte Benutzer und Aufgaben in einem Objekt kombinieren zum nächsten then

authService.authenticate() 
.then(function (user) { 
    var defer = $q.defer() 
    Task.all({user: user}).then(function (tasks) { 

    return defer.resolve({user:user, tasks:tasks}) 
    }) 
    return defer.promise 
}) 
.then(function (data) { 
    $scope.user=data.user; 
    $scope.tasks=data.tasks; 
}) 

passieren DEMO

+0

Danke! Das mache ich im zweiten Beispiel, aber erst nachdem ich es gepostet habe, habe ich herausgefunden, dass ich nur ein einziges Argument an "defer.resolve" übergeben kann, also ist mein Beispiel mit 'defer.resolve (user, tasks) ' etwas falsch. Es scheint die sauberste Lösung für mich zu sein, obwohl es erforderlich ist, ein neues Zurückstellungsobjekt manuell zu erstellen, was sehr viel Geld kosten kann, wenn Sie z.B. eine Variable durch die ganze Kette leiten. – szimek

+0

könnte verschiedene Schritte in einem Service-Objekt speichern, nur das Objekt am Ende zurückgeben – charlietfl

+0

Ich bin nicht vertraut mit Q/Winkelversprechungen, aber wenn "Task" geschieht asynchron, garantiert dies, dass "Defer" sowohl den "Benutzer" enthalten wird und "Aufgaben" -Daten bis zu dem Zeitpunkt, an dem der zweite "then" -Körper auftritt? Wenn ich richtig verstehe, mutiert "defer.resolve()" den Zustand des "defer" -Objekts. Wie also sagt die Rückgabe von "defer.promise", ob der "Task.all" -Thos-Körper beendet wurde oder nicht? Ich versuche zu verstehen, wie diese Lösung funktioniert. –

Verwandte Themen