编辑
第一个答案很优雅,但是,正如在这个问题和另一个stackoverflow问题中多次说明的那样,问题在于服务和控制器在数据实际到达之前运行其操作。
(第一个答案的最后一条评论:)
是的,问题在于API调用完成后,服务才运行并将所有内容返回给控制器,请参见此处screencast.com/t/uRKMZ1IgGpb7 ... 这是我的基本问题,如何等待所有部分的数据到达?
就像我反复说的那样,我们如何创建一个在成功检索数据后填充数组的服务,并且在所有这些操作发生后控制器获取数据,因为正如您在我的截图中看到的那样,事情按不同的顺序进行。
我有这段代码:
var deferred = $q.defer();
$http.get('../wordpress/api/core/get_category_posts/?category_id=14 ').success(function(data) {
//we're emptying the array on every call
theData = [];
catName = data.category.slug;
theData = data;
theData.name = catName;
aggregatedData.push(theData);
});
$http.get('../wordpress/api/core/get_category_posts/?category_id=15 ').success(function(data) {
theData = [];
catName = data.category.slug;
theData = data;
theData.name = catName;
aggregatedData.push(theData);
});
$http.get('../wordpress/api/core/get_category_posts/?category_id=16 ').success(function(data) {
theData = [];
catName = data.category.slug;
theData = data;
theData.name = catName;
aggregatedData.push(theData);
});
$http.get('../wordpress/api/core/get_category_posts/?category_id=17 ').success(function(data) {
theData = [];
catName = data.category.slug;
theData = data;
theData.name = catName;
aggregatedData.push(theData);
});
//deferred.resolve(aggregatedData);
$timeout(function() {
deferred.resolve(aggregatedData);
}, 1000);
/*//deferred.reject('There is a connection problem.');
if (myservice._initialized) {
$rootScope.$broadcast('postsList', deferred.promise);
}*/
//myservice._initialized = true;
myservice = deferred.promise;
return deferred.promise;
我真的不明白为什么在将结果数组传递给defer时要设置超时时间?
难道原则不应该是,defer等待信息返回并返回promise吗?那1秒钟有什么意义呢?据我所知,defer应该能够无限期等待API返回结果,然后返回承诺的数据。
我真的很困惑,在过去的两个小时里,我一直在为我的控制器没有接收到任何数据而烦恼,只有当我设置了超时时间后才得到数据。
$http.get
的返回值放到$q.all
中? - Steve Klösters