我正在使用angularjs' $ http方法获得多个" parent"元素。在这个Ajax Calls .success方法中,我必须迭代父元素,并为每个父元素使用另一个Ajax调用,以获取其各自的子元素。我最终想要的是一个包含所有子元素对象的Array,所以我可以使用ng-repeat显示它们。这就是为什么我想首先收集数组中的所有子元素,并将该数组写入范围数组我用来显示,因此angular只会在收集所有子元素时更新。我并不擅长使用承诺,但我认为应该可以使用它们。结构基本上是:
override func viewDidAppear(animated: Bool) {
UITableView_Auto_Height();
}
基本上,我需要知道jQuery.each中的所有请求何时完成。
修改
所以,我改变了我的代码以包含你的答案,我认为我已经关闭但它仍然无法正常工作。我得到的是:
.success(function(parentElements){
var tempChildElements = [];
$.each(parentElements, function(i, parentElement){
getChildElements(parentElement)
.success(function(childElements){
tempChildElements.concat(childElements);
})
})
});
$scope.childElements = tempChildElements;
});
编辑2: 我使用你们的建议让它工作,下面是我的代码。随意分享改进。
$scope.loadChildren = function(){
var tempchildren = [];
var promises = [];
restApi.getOwnparents() //Returns $http.get promise
.then(function(parents){
parents.data.forEach(function(parent, i, parents){
promises.push(restApi.getOwnchildren(parent) //Returns $http.get promise
.then(function(children){
tempchildren = tempchildren.concat(children.data);
},function(msg){
console.log(msg);
}));
});
}, function(msg){
console.log(msg);
});
$q.all(promises).then(function(data){
//Never gets called
$scope.currentElements = tempchildren;
console.log(tempchildren);
});
};
};
答案 0 :(得分:1)
这样的事情可能是可能的。使用该元素遍历parentElements
调用getChildElements
。但是,getChildElements
的响应将是一个承诺,如果您返回$http
调用,请将其推送到数组并将该数组传递给$q.all
。当您的所有ajax调用解决后,$q.all
将会完成。
var parentElements = [10, 20, 30, 40],
promises = [];
parentElements.forEach(function(i){
//Each method is actually called here
promises.push(getChildElements(i));
});
//$q.all will resolve once all of your promises have been resolved.
$q.all(promises)
.then(function (data){
//handle success
console.log('All Good', data);
//Modify your response into what ever structure you need, map may be helpfull
$scope.childElements = data.map();
});
当数组传递给$q.all
时,很可能你的ajax调用无法解决,但是对于promises来说,另一个好处是即使它们都被解决了$q.all
也会立即解决。
看到它的实际效果。 http://jsfiddle.net/ht9wphg8/
答案 1 :(得分:1)
每个请求本身都会返回一个promise,然后可以将其放入一个数组并将该数组传递给$q.all()
。
不推荐使用success()
回调,因为您需要返回承诺,所以无论如何都需要在原始请求回调中使用then()
。
这是一个可以提出所有请求的示例工厂,一旦完成,您就会将第一个请求的父数据返回给控制器:
app.factory('DataService', function($http, $q) {
return {
getData: function() {
// return initial promise
return $http.get('parent.json').then(function(resp) {
var parentArr = resp.data;
// create array of promises for child data
var promises = parentArr.map(function(parentItem, i) {
// return each child request promise to the array
return $http.get('child.json').then(function(resp) {
console.log('Child request #' + (i + 1) + ' completed');
// update parent item
parentItem.child = resp.data
});
});
// return the promise wrapping array of child promises
return $q.all(promises).then(function() {
console.log('All requests completed');
// when all done we want the parent array returned
return parentArr;
});
});
}
};
});
app.controller('MainCtrl', function($scope, DataService) {
DataService.getData().then(function(parentArr) {
console.log('Add data to scope')
$scope.parentArr = parentArr;
});
});
的 DEMO 强>