繁体   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