Можно ли проверить условие перед всеми вызовами http в Angular?

Можно ли проверить, если: $rootScope.variable is TRUE

Прежде чем будут вызваны все вызовы $http, или я должен проверять каждый отдельный вызов? Некоторые из моих вызовов вызываются через angular factory, а некоторые нет.

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

Любая помощь будет оценена.


person firstChild    schedule 25.02.2015    source источник
comment
вы должны использовать цепочку обещаний, используя .then() для поддержания правильного стека вызовов, вызывая один за другим   -  person Pankaj Parkar    schedule 25.02.2015
comment
Некоторые из моих вызовов звонят через angular factory, а некоторые нет. Почему бы не создать фабрику, которая выполняет эту проверку, а затем постоянно ее использовать? Это будет четко передавать то, что происходит, а не сюрпризы, происходящие в httpInterceptor.   -  person JLRishe    schedule 25.02.2015
comment
Я подумал, что есть что-то вроде httpInterceptor: хорошая мысль. Почему бы вам не прочитать их документацию и не попробовать что-нибудь?   -  person JB Nizet    schedule 25.02.2015


Ответы (2)


Вы можете создать перехватчик для этой проблемы, например:

angular.module('myModule', []).config(function($httpProvider) { 
    $httpProvider.interceptors.push(function($rootScope) {
        return {
            'request': function(config) {
                if($rootScope.yourVariable) {
                    // cancel this request
                }
            }
        }
    });
})

Этот перехватчик обрабатывает каждый запрос. Вы можете найти реализацию для отмены запросов здесь

person boindiil    schedule 25.02.2015

Чтобы продолжить ответ @boindiil. У меня обычно так:

angular.module('someModule', [])
    .factory('httpInterceptorService', ['$q', httpInterceptorService])
    .config(['$httpProvider', interceptorConfig]);

function httpInterceptorService($q) {
    var service = {
        request: request,
        responseError: responseError
    };

    return service;

    function request(config) {
        // do some logic
        return config;
    }

    function responseError(rejection) {
        if (rejection.status === 401) {
             // they were unauthorised.
        }

        return $q.reject(rejection);
    }
}

function interceptorConfig ($httpProvider) {
    $httpProvider.interceptors.push('httpInterceptorService');
}

Здесь он более разрознен. И вы можете видеть, как легко вы можете добавить больше перехватчиков в конвейер. Очевидно, вы можете вводить все, что вам нравится, в httpInterceptorService, например, в $rootScope.

Просто будьте осторожны, не создавайте циклических зависимостей.

Мне нравится то, что прокомментировал @pankajparkar, поддерживая правильный стек вызовов.

Вы можете сделать это вместо использования перехватчиков (как они есть для каждого запроса).

angular.module('someModule', [])
    .factory('mainService', ['$http', '$rootScope', '$q', mainService])
    .controller('MainCtrl', ['mainService', mainCtrl]);

function mainService($http, $rootScope, $q) {
    var service = {
        getThings: getThings
    };

    var serviceBase = '/Api/Things';

    return service;

    function getThings() {
        var deferred = $q.defer();

        $http.get(serviceBase).then(function (data) {
            if (data.data.someVariable == $rootScope.someVariable) {
                deferred.resolve(data.data);
            } else {
                deferred.reject(data);
            }
        }).catch(function (message) {
           deferred.reject(message);
        });

        return deferred.promise;
    }
}

function mainCtrl(mainService) {
    var vm = this;

    vm.httpData = {};

    mainService.getThings().then(function (data) {
        vm.httpData = data;
    }, function (message) {
        // do something with the error.
    });
}
person Callum Linington    schedule 25.02.2015
comment
Да, это определенно более чистая реализация, и я бы не стал напрямую использовать свой код в производстве. Однако я просто хотел направить firstChild в правильном направлении и дал ссылку на документацию, где можно найти более чистую реализацию. - person boindiil; 25.02.2015
comment
@boindiil да, это справедливо :) - person Callum Linington; 25.02.2015
comment
@pankajparkar — это вторая часть моего ответа, что вы имели в виду? - person Callum Linington; 25.02.2015
comment
В нашем производственном приложении у нас есть служба Api, обертывающая все вызовы $http, которая проверяет с помощью перехватчика в службе аутентификации, чтобы увидеть, есть ли токен аутентификации в локальном хранилище $cookieStore, и если да, то вводит его в заголовки перед созданием звонок. Сервисная оболочка для вызовов $http может быть очень полезной. - person Daniel Nalbach; 19.01.2016
comment
@DanielNalbach, разве у вас не только перехватчик делает это? Или вы говорите, что обертываете http-сервис своим собственным сервисным уровнем, но также имеете перехватчик - person Callum Linington; 19.01.2016
comment
@CallumLinington - мы обертываем службу http, а также имеем перехватчик. В оболочке API происходит несколько вещей, включая аутентификацию, определение индикатора загрузки (на основе обещаний в очереди), удаление заголовков или внедрение и так далее. - person Daniel Nalbach; 19.01.2016
comment
@DanielNalbach Я стараюсь сохранять все сквозные проблемы в этих перехватчиках и просто использую оболочку API в качестве диспетчера/посредника. - person Callum Linington; 19.01.2016