Сервисная функция AngularJS не возвращает полное обещание после завершения цикла while - PullRequest
2 голосов
/ 20 сентября 2019

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

Я внедрил функцию разрешения в моем маршрутизаторе, которая будет вызывать службу, которая выполняетнумерацию страниц (используя цикл while) и извлекает результаты.

При запуске кода внутри контроллера количество «продуктов» всегда составляет 1/2 или 2/3 от полной суммы в зависимости от браузераиспользовался.Контроллер инициализируется до завершения цикла while / возврата всех обещаний.Я немного сбит с толку относительно того, как заставить контроллер ждать получения всех результатов из цикла while.Нужно ли вносить изменения в мою сервисную функцию, контроллер или маршрутизатор (или все три?).Или я неправильно использую библиотеку $ q?

Внутри моего маршрутизатора:

    .state('products-map', {
        url: "/products-map",
        parent: 'base',
        templateUrl: "../components/products/products.map.html",
        data: { pageTitle: 'Products Map', pageSubTitle: 'map of all the products'},
        controller: "ProductsMapController",
        resolve: {
            deps: ['$ocLazyLoad', function($ocLazyLoad) {
                return $ocLazyLoad.load({
                    name: 'myApp',
                    insertBefore: '#ng_load_plugins_before',
                    files: [
                        { type: 'js', path: '//maps.google.com/maps/api/js?v=3&key=<my_api_key>&libraries=visualization,geometry'},
                        '../js/markerclusterer_packed.js',
                    ]
                });
            }],

            total_products: function(DashboardService) {
                return DashboardService.getTotalProducts();
            },

            products: function(DashboardService, total_products){
                return DashboardService.getPaginatedProducts(total_products);
            },

        }
    })

Внутри моей сервисной функции, которая обрабатывает нумерацию страниц:

this.getPaginatedProducts = function(total_product_count) {

    var total_fetched_results = 0;
    var total_number_of_products = total_product_count;
    console.log("total number of products in paginated products: ", total_number_of_products);
    var results_per_page = 20000;
    var page = 1;
    var products = [];

    var deferred = $q.defer();

    while (total_number_of_products > total_fetched_results) {

        $http({
            url: $rootScope.apiUrl + 'products/location',
            method: "GET",
            params: { 'results_per_page': results_per_page, 'page': page}
        }).then(function(response) {
            console.log("response from service", response);
            var response_data = response.data.data;
            for (var i = 0; i < response_data.length; i++) {
                products.push(response_data[i]);
            }
        });

        page++;
        total_fetched_results += results_per_page;
    }

    deferred.resolve(products);
    return deferred.promise;
};

Внутри моего контроллера:

angular.module('SS2').controller('ProductsMapController', ['$rootScope', 'products', '$scope', '$http', 'NgMap', 'total_products',
    function ($rootScope, products, $scope, $http, NgMap, total_products) {

        $scope.$on('mapInitialized', function (event, map) {

            console.log("ProductsMapController Initialised")
            console.log("total_products inside ProductsMapController is: ", total_products);
            $scope.map_products = products;
            console.log("inside controller number of products is: ", products);

1 Ответ

0 голосов
/ 20 сентября 2019

Есть несколько подходов, которые вы можете использовать здесь, и использование Обещаний, безусловно, имеет смысл.То, что происходит с вашим циклом while, - это логический недостаток, когда ваши $http запросы не все решаются до того, как ваша функция достигнет своего состояния выхода.

Возможно, вы захотите изучить использование $q.all() и создание массива вызовов $http, чтобы убедиться, что все решено ДО того, как вы вернете свои результаты, как я подозреваю, когда вы смотрите на свой сетевой монитор, выВы увидите, что вызовы не будут решены до того, как будут отображены результаты.

https://docs.angularjs.org/api/ng/service/$q#all

отличный пример - https://chariotsolutions.com/blog/post/angularjs-corner-using-promises-q-handle-asynchronous-calls/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...