Я пытаюсь разбить карту на страницы.Я хочу заставить контроллер ждать службы, которая выполняет нумерацию страниц, чтобы вернуть все доступные продукты, прежде чем пытаться что-либо делать.
Я внедрил функцию разрешения в моем маршрутизаторе, которая будет вызывать службу, которая выполняетнумерацию страниц (используя цикл 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);