Angularjs $ http承诺;从$ http()获取回调函数fn1和fn2然后(fn1,fn2)

时间:2015-04-21 08:22:48

标签: javascript angularjs http angular-promise

我正在做一个自定义的Oauth2身份验证模块。我有一个requestExecutor工厂:

     $http({
        url: requestObject.url, 
        method: requestObject.method, 
        cache: requestObject.cache, 
        headers: requestObject.headers, 
        data: requestObject.data})

        .then(function (resData) {
           if (requestObject.callback) {
               requestObject.callback(resData.data);
           }
         }, function () {
           if (requestObject && requestObject.customErrorCallback) {
               requestObject.customErrorCallback();
           }
        });

和Http Interceptor:

'responseError': function (rejection) {
       console.log(rejection)
       switch (rejection.status) {
               case 401 :
               {
                  $rootScope.$emit(CONST.UNAUTHORIZED);
                  break;
               }
               case 403 :
               {
                  $rootScope.$emit(CONST.FORBIDDEN, rejection.config);
                  break;
               }
            }
            return $q.reject(rejection);
       }

因此,当我执行请求并获得403响应错误时 从服务器我想将完整的请求发送给CONST.FORBIDDEN的监听器(唯一缺少的是来自$http().then() promise的回调)。原因是我想在刷新访问令牌后再次执行失败的请求。

我的问题是:

  1. 存储在哪里$http().then()承诺?
  2. 可以获得$http().then()承诺吗?
  3. 我该如何实施2.?

1 个答案:

答案 0 :(得分:1)

不确定您的意图,可能会有更好的解决方案,但您可以在配置对象中注册回调处理程序并在拦截器中访问它们。 plnkr

但这是一个更好的设计。 angular-app/securityInterceptor 您将在拦截器中进行刷新并再次执行请求。如果第二个请求成功,则返回结果,该结果将由您的成功/错误处理程序处理。

$scope.fetchAsync = function(forceError) {
    function successHandler(result) {
        $scope.content = result.data;
    }

    function errorHandler(result) {
        $scope.content = result;
    }   

    $scope.content = 'Loading...';

    $http.get(forceError ? 'not-found' : 'test.txt', {
      handler: {
        success: successHandler,
        error: errorHandler
      }
    }).then(successHandler, errorHandler);
}

$httpProvider.interceptors.push(function($q) {
    return {
        'responseError': function(rejection) {
            console.log(rejection.config.handler);
            return rejection;
        }
    };
});