AngularJS从服务中返回一个承诺

时间:2014-04-29 13:48:01

标签: javascript angularjs

我使用以下代码从我的客户端API获取AngularJS应用程序令牌,然后将此令牌保存在每30分钟到期的cookie中。我已经添加了代码来首先检查cookie,如果它没有过期,那么我可以在cookie中使用令牌,如果已过期,那么我将从服务器请求新令牌。

我现在面临的问题是getToken必须返回一个promise,如果我使用$ http调用API,这很容易,但想知道如何在检查cookie后返回一个promise并从cookie返回令牌调用API?任何例子都非常感谢。感谢

  getToken : function(){
      var token = '';
      var deferred = $q.defer();
      var urlString = 'http://domainname.com/client.php';

      //returns '' if cookie expired or token if cookie exist...
      token = LocalService.getTokenCookie();

     if(token == ''){
      $http({ method:'POST',
            url: urlString,
            headers: { 'content-type' : 'application/x-www-form-urlencoded; charset=UTF-8'
            },
            responseType: 'json'
       }).success(function(data,status,headers,config){
            deferred.resolve(data);
            token = data.Token;
            //....save token in a cookie...          
      }).error(function(data,status,headers,config){ 
            deferred.reject(status);
      });           
      }
      return deferred.promise;   
   }

1 个答案:

答案 0 :(得分:4)

您可以立即解决延迟问题,promise.then(...)仍然可以正确处理(即使解析后调用)。 E.g:

getToken : function(){
    var token = '';
    var deferred = $q.defer();
    ...
    token = LocalService.getTokenCookie();

    if(token == ''){
        $http({...}).success(function (data) {
            deferred.resolve(data);
            ...
        }).error(function (data, status) { 
            deferred.reject(status);
        });
    } else {
        /* Resolve immediatelly */
        deferred.resolve(token);
    }

    return deferred.promise;   
}