Предотвращение дублирования кода в запросах на получение в AngularJS

У меня часы на кнопке фильтра. Когда пользователь нажимает на него, он обращается к наблюдателю. Мне нужно отправить запрос на сервер. Получите ответ, сохраните его и сразу запросите следующий запрос на получение. По одному.

$scope.$watch('dataService.getValue()', function (newValue, oldValue) {
        if (newValue !== oldValue) {

            var selectedValue = $scope.dataFilterService.getValue();
            $scope.httpService.getFilteredData(selectedValue).then(function (response) {
                var filteredData = response.data;
                $scope.httpService.getFilteredData2(selectedValue ).then(function (response) {
                    var filteredData2 = response.data;
                    $scope.httpService.getData3().then(function (response) {
                        var filteredData3 = response.data;
                        $scope.httpService.getData4().then(function (response) {
                            var filteredData4= response.data;
                            $scope.httpService.getData5().then(function (response) {
                                var filteredData5= response.data;

                                $scope.dataToMapService.init(filteredData, filteredData2 , filteredData3, filteredData4, filteredData5);


                            }, function (error) {
                                $scope.errorService.handleError(error);
                            });


                        }, function (error) {
                            that.errorService.handleError(error);
                        });
                    }, function (error) {
                        that.errorService.handleError(error);
                    });
                }, function (error) {
                    that.errorService.handleError(error);
                });

            }, function (error) {
                that.errorService.handleError(error);
            });

        }
    });

Этот код работает нормально, однако дублируется в двух контроллерах.

Для предотвращения дублирования кода я предложил добавить новую услугу и в ней код. Однако это не так, как я ожидал. Не дожидаясь ответа на первый запрос. Что я должен сделать, чтобы написать его лучше и предотвратить дублирование кода?


person Aviade    schedule 14.12.2014    source источник
comment
Вам нужно, чтобы они шли в цепочке или можно отправлять параллельно?   -  person Ben Diamant    schedule 14.12.2014


Ответы (1)


Используйте массив вызовов $q и $http, чтобы сделать одно обещание:

angular.module('myApp').factory('getDataService', function ($q, $http, httpService) {

    var service = {
        getData: function () {
            var defer = $q.defer();
            var callChain = [];
            callChain.push(httpService.getFilteredData(selectedValue));
            callChain.push(httpService.getFilteredData2(selectedValue));
            callChain.push(httpService.getData());
            callChain.push(httpService.getData2());
            callChain.push(httpService.getData3());
            $q.all(callChain).then(
                function (results) {
                    console.log(results); //Array of results in the order of the send
                    defer.resolve(results);
                });
            return $q.promise;

        }
    }
    return service;
}).controller('myCtrl', ['$scope', 'getDataService', function($scope, getDataService) {

    getDataService.getData().then(function(result) {
        console.log(results); //Array of results in the order of the send
    });
}]);
person Ben Diamant    schedule 14.12.2014
comment
Спасибо. Выглядит здорово, однако мой код не работает при Невозможно прочитать свойство 'then' неопределенного, когда мы переходим к строке - $q.all(callChain).then( и я не понимаю, почему - person Aviade; 15.12.2014
comment
ты скопипастил как есть? @Мистер Вопрос - person Ben Diamant; 15.12.2014
comment
Да и не получилось. Сделал небольшую модификацию и все работает! Спасибо! - person Aviade; 16.12.2014