2013-11-23 121 views
5

我有以下代碼:如何訪問先前在AngularJS承諾鏈中承諾的結果?

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

是否有user對象傳遞給第二then功能,無需做這樣的事情了一些內置的方式:

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

或本:

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 
}) 

或通過直接呼叫第二個then來嵌套它們Task.all(這樣我可以通過關閉獲得user對象)?嵌套它們正是我想要避免的。

回答

2

你可以把又在哪裏用戶仍然可以訪問的範圍內(檢查瓶蓋)

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

從Kriskowal的Q documentation本身,這兩種風格是等價的。 Angular的$q是基於Q

唯一的區別是嵌套。如果需要在閉包中捕獲多個輸入值,則嵌套處理程序非常有用。

+0

謝謝,但這是我在談論我的問題的第三種情況 - 嵌套他們:)我試圖避免它,因爲我只是展示了一個簡化的例子 - 在真正的代碼中有更多的承諾,所以嵌套它們就像使用回調。 – szimek

+0

嗯...是的,你是對的。問題是我在代碼中使用了這種嵌套風格,代碼真的很大......嵌套的層次並不是很大。此外,Coffeescript語法也有很大幫助;) –

+0

我也使用CoffeeScript,因此我會嘗試嵌套它們並查看它的外觀。雖然我並不確定錯誤處理如何在嵌套承諾的情況下工作...... – szimek

1

可以結合用戶和任務到一個對象傳遞給下一個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; 
}) 

DEMO

+0

謝謝!這就是我在第二個例子中所做的事情,儘管只是在發佈之後,我發現我只能將一個參數傳遞給'defer.resolve',所以我用'defer.resolve(user,tasks)'的例子是稍微不正確。這對我來說似乎是最乾淨的解決方案,但需要手動創建一個新的延遲對象,如果需要,可能會吸引很多。在整個鏈中傳遞一個變量。 – szimek

+0

可以在服務對象中存儲各種步驟,只是在末尾返回該對象 – charlietfl

+0

我不熟悉Q/Angular promise,但是如果'Task'異步發生,這是否保證'defer'將包含'user'和'任務'數據在第二個'then'主體出現時?如果我理解正確,'defer.resolve()'會突變'defer'對象的狀態,那麼如何返回'defer.promise'知道'Task.all'然後body是否終止?我試圖瞭解這個解決方案是如何工作的。 –