AngularJS - 从 $http.get 循环返回承诺
AngularJS - returning promise from $http.get loop
我在分页端点上发出 GET 请求,因此,我进行一次调用,找出端点有多少页,然后遍历每一页,将每一页的响应数据推送到一个数组中。
但是,由于调用量太大,当从我的控制器中获取工厂数据时,我需要在我的函数上设置一个超时,以确保所有数据在使用之前都已进入。
我希望在我的工厂中将其转换为控制器将等待直到请求完成的承诺。但是由于我循环遍历每一页,所以我通常构建它的方式不起作用。我如何修改它以使 promise 等待通过我的端点页面的完整循环,以便我可以从我的控制器中删除超时?
工厂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);
});
};
您应该在 GET 调用函数之外创建一个延迟对象,并仅在所有请求完成后才解析它。所以我认为它可以看起来像这样
var productsData = [];
var pageNumber = 1;
var deferred;
function getAllProducts() {
deferred = $q.defer();
_getPageProducts(pageNumber);
return deferred.promise;
}
function _getPageProducts(pageNumber) {
$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]);
};
if (pageNumber < response.data.pages) {
pageNumber++;
_getPageProducts(pageNumber);
} else {
deferred.resolve(productsData) ;
}
});
}
我在分页端点上发出 GET 请求,因此,我进行一次调用,找出端点有多少页,然后遍历每一页,将每一页的响应数据推送到一个数组中。
但是,由于调用量太大,当从我的控制器中获取工厂数据时,我需要在我的函数上设置一个超时,以确保所有数据在使用之前都已进入。
我希望在我的工厂中将其转换为控制器将等待直到请求完成的承诺。但是由于我循环遍历每一页,所以我通常构建它的方式不起作用。我如何修改它以使 promise 等待通过我的端点页面的完整循环,以便我可以从我的控制器中删除超时?
工厂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);
});
};
您应该在 GET 调用函数之外创建一个延迟对象,并仅在所有请求完成后才解析它。所以我认为它可以看起来像这样
var productsData = [];
var pageNumber = 1;
var deferred;
function getAllProducts() {
deferred = $q.defer();
_getPageProducts(pageNumber);
return deferred.promise;
}
function _getPageProducts(pageNumber) {
$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]);
};
if (pageNumber < response.data.pages) {
pageNumber++;
_getPageProducts(pageNumber);
} else {
deferred.resolve(productsData) ;
}
});
}