2015-11-21 147 views
0

我工作的用戶身份驗證功能,在兩個階段的工作:使用另一個承諾的角度承諾?

  • 一個HTTP(REST)調用來獲取和確認用戶的身份
  • 隨後打電話到第二系統,這將確認用戶的「角色」(系統權限)。

在第一次通話完成之前,我無法進行第二次通話。

我有一個名爲UserService服務具有的功能有點像這樣:

UserService.load() # returns a promise which has when resolved gives the user's identity as a sring. 

我也想能夠做到包起來,這樣我有:

RoleService.load() # returns a promise which when resolved gives the user's valid roles in the form ["role1", "role2", ... "roleN"] 

在爲了實現RoleService.load(),我想我必須做類似這樣的事情:

load:()-> 
if promise? 
    # Dont do anything if this promise is already cached 
    promise 
else 
    promise = UserService.load().then((standardId)=> 
    @set(@getRolesForUser(standardId)) 
) 

哪種作品假設getRolesForUser(u)立即返回。問題是第二個電話也將在網絡上,所以它必須變成另一個承諾。

我真正希望能夠做的是將解決第一個承諾的方式鏈接到承諾中,我傳遞給鏈的下一個階段是第二個承諾的輸出。

可以這樣做嗎?語法是什麼?

回答

1

做這樣的事情, 等待一個完成。

UserService.load() 
.then(function(res){ 
     var id = res.data.id; 
    RoleService.load() 
    .then(function(role){ 
     var roleId = role.id; // your logic 
    }) 
}); 

另一種更好的方法是鏈接承諾。

UserService.load() 
.then(function(res){ 
    var id = res.data.id; 
    return RoleService.load(); 

}) 
.then(function(role){ 
     var roleId = role.id; // your logic 
}); 
1

您可以創建一個新的延期並返回他的承諾。 然後,當你從第二個呼叫的價值就可以解決的承諾:

function load() { 
    var deferred = $q.defer(); 
    UserService.load().then(function(standardId){ 
    getRolesForUser(standardId).then(function(val) { 
     deferred.resolve(val) 
    }) 
    }); 
    return deferred.promise; 
}