Вопрос: AngularJs: прослушиватель событий по HTTP-запросам


Поскольку я использую Oauth2 для защиты своего Api, мне нужно получить новый токен доступа до любых HTTP-запросов, если предыдущий токен доступа истек.

Я до сих пор не пользовался прослушивателем событий.

Вот что я сделал сейчас (Пожалуйста, дайте мне знать, если это правильно):

ApplicationController.js  :

app.controller('ApplicationController', function($rootScope, $scope, $localStorage, AuthService){

    // Listening event apiRequested
    $scope.$on('event:apiRequested', function(e) {

        AuthService.token();
        // Restore the access_token in case it has changed
        access_token = $localStorage.getObject('access_token');

    });

})

UserController.js:

$rootScope.$broadcast('event:apiRequested');

// Get Users around
return $http.post(domain+'/api/users?access_token='+access_token.key, data).then(function(response){
    return response;
});

Первое, что я не уверен ... обрабатывает ли $ http, если событие уже выполнено полностью?

Так что, поскольку я не уверен, я думаю о добавлении обратного вызова.

Здесь идея:

$rootScope.$broadcast('event:apiRequested', function(response){

    if(response){

        // Get Users around
        return $http.post(domain+'/api/users?access_token='+access_token.key, data).then(function(response){
            return response;
        });

    }

});

Пожалуйста, дайте мне знать, если это возможно, или я должен использовать что-то еще, кроме прослушивателя событий для этого случая.


4


источник


Ответы:


Почему бы вам не использовать перехватчики  это делается для перехвата HTTP-запроса? В вашем случае вы добавите это очень специфическое поведение в часть «запрос».

См. Пример перехватчика:

var $myService; // Add a constant that store the service
    $httpProvider.interceptors.push(['$location', '$injector', '$q', function($location, $injector, $q) {
                             return {

                               'request' : function(config){
                                 console.log("intercept request", config.url,config)
                                 // Your token shall be retreive in this part
                                 return config
                               },
                               'response' : function(config){
                                 $myService= $myService|| $injector.get('$myService'); // inject the service manually if constant is undefined
                                 console.log("intercept response", config)
                                 // Your token shall be retreive in this part
                                 return config
                               },
                                 'responseError': function(rejection) {

                                     console.log("responseError intercepted" , rejection);
                                      if (rejection.status === 403) {

                                         return $q.reject(rejection);

                                     } else if (rejection.status === 423) {



                                         return $q.reject(rejection);
                                     }else
                                          return $q.reject(rejection);
                                 }
                             };
                         }]);

Перехватчики должны быть определены в .config(["$httpProvider", function($httpProvider)


4



AngularJs: прослушиватель событий по HTTP-запросам | Programmerz.ru