我有这样的代码:
// HTTP request
$http.get(dataSource).
then(function(data, status, headers, config) {
// Products array
var products = [];
// Loop through each array value
for (var slug in data.data){
var product = data.data[slug];
$http.get('content/products/' + product + '.json').then(function(response){
products.push(response.data);
$scope.products = products;
}).catch(function(){
console.log('there was an error');
});
}
}).catch(function(){
console.log('there was an error');
});
问题是,有时产品范围数组项并不总是按照请求的顺序到达。
我需要产品$scope循环遍历数组,并且只有当响应被推送到数组时:
products.push(response.data);
它最终被分配给变量$scope.products
。
修改我当前的HTTP请求有帮助吗?
发布于 2016-03-15 12:34:46
问题存在于包含异步代码的for循环中,即同步的。在实践中,无法保证内部http.get以相同的顺序处理数据。
试试这个:
// HTTP request
$http.get(dataSource).
then(function(data, status, headers, config) {
// Products array
var products = [];
// Loop through each array value
var promises = [];
for (var slug in data.data){
var product = data.data[slug];
promises.push($http.get('content/products/' + product + '.json'));
}
$q.all(promises).then(function(response){
for (var i=0,len = response.length;i<len;++i){
products.push(response[i].data);
}
$scope.products = products;
}).catch(function(){
console.log('there was an error');
});
}).catch(function(){
console.log('there was an error');
});
我建议使用$q.all()
来保持http.get结果的顺序。还请注意,$scope.products
是在for循环之后,该循环按照您指定的方式将数据值分配给products
数组。
https://stackoverflow.com/questions/36011373
复制相似问题