编辑
第一个答案是优雅的,但是,正如在这个问题和另一个关于stackoverflow的问题中多次提到的那样,问题是服务和控制器在数据实际到达之前运行它们的东西。
(对第一个答案的最后评论:)
是的,问题是API在服务运行后调用finish,并将所有内容返回给控制器,请参见此处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;
对于我的生活,我不能理解为什么我必须在传递结果数组时设置一个超时来推迟?
原则不应该是这样的吗,推迟等待信息到来,然后返回承诺?那1秒的意义是什么?据我所知,defer应该能够等待API返回结果和返回承诺数据所需的时间。
我真的很困惑,在过去的两个小时里,我的头撞到了墙上,因为我的控制器中没有接收到任何数据,只有当我把超时设置在那里的时候。
发布于 2013-09-07 23:32:36
我想有一种更聪明(也更优雅)的方式可以用$q.all
来完成这个任务。
请看一下下面的代码。
我假设您希望立即返回数据,并将所有结果聚合到一个大数组中。
var myApp = angular.module('myApp', []);
myApp.factory('myService', function ($http, $q) {
return {
getAllData: function () {
return $q.all([
$http.get('../wordpress/api/core/get_category_posts/?category_id=14'),
$http.get('../wordpress/api/core/get_category_posts/?category_id=15'),
$http.get('../wordpress/api/core/get_category_posts/?category_id=16'),
$http.get('../wordpress/api/core/get_category_posts/?category_id=17')
]).then(function (results) {
var aggregatedData = [];
angular.forEach(results, function (result) {
aggregatedData = aggregatedData.concat(result.data);
});
return aggregatedData;
});
}
};
});
您可以在上面看到,只有在通过$q.all
完成所有异步调用后,才会生成aggregatedData
。
例如,您只需要将服务作为依赖项包含到您的一个控制器中,并像这样调用服务myService.getAllData()
希望这对您有所帮助,或者让我知道您是否需要完整的工作示例,我可以提供一个!:)
发布于 2013-09-07 23:28:52
$http.get
调用是异步的,但是您不必等到它们全部完成后才解析延迟的调用。在这里,它使用超时很简单,因为您很幸运,调用有时间在1秒内完成,但这根本不可靠。
我不会在这里重申一个完整的解决方案,但让我们看看my answer中的另一个类似问题。
https://stackoverflow.com/questions/18673890
复制相似问题