Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 以角度发送嵌套的$http请求_Javascript_Angularjs - Fatal编程技术网

Javascript 以角度发送嵌套的$http请求

Javascript 以角度发送嵌套的$http请求,javascript,angularjs,Javascript,Angularjs,在我的AngularJS1.6.4应用程序中,在发送任何$http请求之前需要进行一些检查,因此我创建了一个服务来处理这个问题,并使用它发送任何请求。此服务仅包含一个公共函数“send”,用于获取请求数据并执行一些检查: 1-检查是否有令牌:如果没有发送请求以获取来宾令牌,则发送所需请求。 2-如果有令牌:检查它是否过期:如果没有,发送所需的请求。 3-如果过期:发送刷新令牌请求,然后发送所需请求 我的服务代码: (function() { function service($http, t

在我的AngularJS1.6.4应用程序中,在发送任何$http请求之前需要进行一些检查,因此我创建了一个服务来处理这个问题,并使用它发送任何请求。此服务仅包含一个公共函数“send”,用于获取请求数据并执行一些检查: 1-检查是否有令牌:如果没有发送请求以获取来宾令牌,则发送所需请求。 2-如果有令牌:检查它是否过期:如果没有,发送所需的请求。 3-如果过期:发送刷新令牌请求,然后发送所需请求

我的服务代码:

(function() {
  function service($http, tokenManager, apiService, API_URL, REFRESH_TOKEN_URL, appToken) {
    var s = {};
    var defaultToken = appToken;


    s.send = function(data) {
      var token = tokenManager.getToken();
      if (token && token.length > 0) {
        // check if expired
        var isTokenExpired = tokenManager.isTokenExpired();
        if (isTokenExpired) {
          sendRefreshTokenRequest(token).then(function(response) {
            // update the exist token and send with the new one
            return sendTheRequiredRequest(data, token);
          }, function(errors) {

          });
          // token is expired so we need to send refresh token then send our request
        } else {
          // send our request
          return sendTheRequiredRequest(data, token);
        }
      } else {
        token = defaultToken;
        // if the request not login or count send getToken for guest first
        if (data.loginAuthentication || data.countryCitiesAreasList) {
          //send the request with the defaultToken
          return sendTheRequiredRequest(data, defaultToken);
        } else {
          // send guest token first then the request
          sendRequestGetTokenForGuest(defaultToken).then(function(response) {
            var newToken = response.data.token;
            var isSetted = tokenManager.setToken(newToken);
            return sendTheRequiredRequest(data, newToken);
          }, function(errors) {

          });
        }
      }
    };


    function sendRequestGetTokenForGuest(token) {
      var data = apiService.getApiObj("gtoken", "11651");
      var headerParams = createHeaderParams(token);
      return $http({
        method: "POST",
        url: API_URL,
        headers: headerParams,
        data: data 
      });
    }

    function sendRefreshTokenRequest(token) {
      var headerParams = createHeaderParams(token);
      return $http({
        method: "POST",
        url: REFRESH_TOKEN_URL,
        headers: headerParams
      });
    }

    function sendTheRequiredRequest(data, token) {
      var headerParams = createHeaderParams(token);
      return $http({
        method: "POST",
        url: API_URL,
        headers: headerParams,
        data: data
      });
    }

    function createCurrentTimeStamp() {
      return Math.floor(Date.now()).toString();
    }

    function createHeaderParams(token) {
      var headerParams = {
        token: token,
        clientTimeStamp: createCurrentTimeStamp()
      };
      return headerParams;
    }

    return s;
  }
  angular.module('app').factory('apiRequestSender', service);
})();
我通过调用函数“send”在每个控制器的每个服务中使用此服务,并将数据传递给它并返回:

return apiRequestSender.send(data);
然后在路由中使用此服务,如下所示:

   {
      name: 'home',
      url: '/index',
      templateUrl: 'home/views/index.html',
      controller: 'homeController',
      controllerAs: 'vm',
      resolve: {
        apiResponse: function(homeApiService) {
          return homeApiService.getCitiesAreas();
        }
      }
    }

现在状态没有呈现,那么我的错误是什么,或者我如何在每个请求之前执行这些检查???

我认为在这里使用
$http
拦截器会很有用。

基本上,这将确保在每次检查之前执行函数检查 要求这里的要点是,
request
函数接收一个配置对象,然后您可以 修改并检查此
config
对象,您需要做的就是确保返回此(或新的)
config
对象。 (直接返回或在承诺范围内返回)

由于需要在拦截器中执行一些
$http
请求,因此需要确保 它不会以无限循环结束。所以,这里的重点是检查URL的地址 是在拦截器本身中进行的,当请求带有这样一个URL时,您只需 返回配置对象

我用你的代码为你制作了一个样本工厂

请注意,这不是测试,应该只是给你一个如何做的想法

myInterceptor.js

angular
  .module('app')
  .factory('myInterceptor', myInterceptor);


myInterceptor.$inject = [
  '$http',
  'tokenManager',
  'apiService',
  'REFRESH_TOKEN_URL',
  'GUEST_TOKEN_URL'
];

function myInterceptor($http, tokenManager, apiService, REFRESH_TOKEN_URL, GUEST_TOKEN_URL) {
  return {
    request: request
  };

  function request(config) {
    if (config.url === REFRESH_TOKEN_URL || config.url === GUEST_TOKEN_URL) {
      // Make sure to avoid an Infinite Loop (http calls within the Interceptor)
      return config;
    }

    var defaultToken = appToken;
    var token = tokenManager.getToken();
    if (token && token.length > 0) {

      var isTokenExpired = tokenManager.isTokenExpired();
      if (isTokenExpired) {

        // Set the Header Params and return the Config object.
        return sendRefreshTokenRequest(token).then(function(response) {
          config.headers = createHeaderParams(token);
          return config;
        });

      } else {

        config.headers = createHeaderParams(token);
        return config;
      }
    } else {
      token = defaultToken;

      if (data.loginAuthentication || data.countryCitiesAreasList) {
        config.headers = createHeaderParams(defaultToken);
        return config;
      } else {
        // Set the Header Params and return the Config object.
        return sendRequestGetTokenForGuest(defaultToken).then(function(response) {
          var newToken = response.data.token;
          var isSetted = tokenManager.setToken(newToken);
          config.headers = createHeaderParams(newToken);
          return config;
        });
      }
    }
  }

  function createCurrentTimeStamp() {
    return Math.floor(Date.now()).toString();
  }

  function createHeaderParams(token) {
    var headerParams = {
      token: token,
      clientTimeStamp: createCurrentTimeStamp()
    };
    return headerParams;
  }

  function sendRequestGetTokenForGuest(token) {
    var data = apiService.getApiObj("gtoken", "11651");
    var headerParams = createHeaderParams(token);
    return $http({
      method: "POST",
      // url: API_URL,
      // Changed because you want to capture this URL in the Interceptor,
      // so it wont do its checks when the url is like this. (avoid Infinite loop)
      url: GUEST_TOKEN_URL,
      headers: headerParams,
      data: data
    });
  }

  function sendRefreshTokenRequest(token) {
    var headerParams = createHeaderParams(token);
    return $http({
      method: "POST",
      url: REFRESH_TOKEN_URL,
      headers: headerParams
    });
  }
}
注册拦截器:

angular
  .module('app')
  .config(['$httpProvider', function($httpProvider) {
    $httpProvider.interceptors.push('myInterceptor');
 }]);
希望这有帮助:)