我在分頁端點上發出GET請求,因此,我正在進行一次調用,找出端點有多少頁,然後遍歷每個頁面,推送響應數據從每個頁面轉換爲一個數組。
但是,由於調用非常大,因此在從我的控制器中獲取此工廠數據時,我需要在我的函數中設置一個超時值,以確保所有數據在使用前都已進入。
我希望能切換到我的工廠的承諾,控制器將等待,直到請求完成。但是由於我正在循環瀏覽每個頁面,所以我通常會構造這種方式不起作用。我怎麼可以重做這個,使承諾等待通過我的終端頁面的完整循環,所以我可以從我的控制器中刪除超時?
廠API GET請求
var productsData = [];
var pageNumber = 1;
var getAllProducts = function(){
var deferred = $q.defer();
return $http.get('/api/scroll?page=' + pageNumber,{cache: true})
.then(function(response) {
for (var i = response.data.results.length - 1; i >= 0; i--) {
productsData.push(response.data.results[i]);
};
while (pageNumber <= response.data.pages) {
getAllProducts();
pageNumber++;
}
deferred.resolve(productsData)
return deferred.promise;
});
};
控制器功能
var filterProducts;
var getProducts = function(type, filter) {
productFactory.getAllProducts()
.then(function(products) {
$timeout(function(){
var allProducts = products;
switch (type) {
case "category":
filterProducts = $filter('filter')(allProducts, {
custom: {category_code: filter}
});
break;
case "color":
filterProducts = $filter('filter')(allProducts, {
custom: {color_code: filter}
});
break;
case "season":
filterProducts = $filter('filter')(allProducts, {
custom: {season: filter}
});
break;
default:
filterProducts = allProducts;
}
$rootScope.products = _.sortBy(filterProducts, function(product) {
return product.custom.sku;
});
}, 1000);
});
};
避免[遞延反模式](http://stackoverflow.com/q/23803743/1048572)! – Bergi