使用另一个承诺的角度承诺?

时间:2015-11-21 18:35:03

标签: javascript angularjs coffeescript

我正在开发一个有两个阶段的用户身份验证功能:

  • 一次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)立即返回,哪种工作正常。问题是这第二次调用也将在网络上,所以它必须转变为另一个承诺。

我真正希望能够做到的是以这样的方式链接承诺,即解决了第一个承诺,我传递给链的下一个阶段的是第二个承诺的输出。

可以这样做吗?语法是什么?

2 个答案:

答案 0 :(得分:1)

您可以创建新的延迟并返回其承诺。 然后当你获得第二次通话的价值时,你可以解决这个承诺:

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

答案 1 :(得分: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
 });