簡體   English   中英

使用另一個承諾的有角度的承諾?

[英]An angular promise that uses another promise?

我正在研究可在兩個階段工作的用戶身份驗證功能:

  • 一個HTTP(其余)調用,以獲取並確認用戶的身份
  • 隨后調用第二個系統,該操作將確認用戶的“角色”(系統上的權限)。

在第一個電話完成之前,我無法撥打第二個電話。

我有一個名為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)立即返回,該進行哪種工作。 問題在於,第二個呼叫也將在網絡上,因此必須將其變成另一個承諾。

我真正想要做的就是以這樣一種方式來鏈接許諾:解決了第一個許諾之后,我傳遞給鏈的下一階段的就是第二個許諾的輸出。

能做到嗎? 語法是什么?

您可以創建新的延期並返回他的承諾。 然后,當您獲得第二個調用的值時,您可以解決承諾:

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

做類似的事情,等待一個完成。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM