首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >AngularJS承诺,$q,延期

AngularJS承诺,$q,延期
EN

Stack Overflow用户
提问于 2013-09-07 21:38:30
回答 2查看 28.3K关注 0票数 16

编辑

第一个答案是优雅的,但是,正如在这个问题和另一个关于stackoverflow的问题中多次提到的那样,问题是服务和控制器在数据实际到达之前运行它们的东西。

(对第一个答案的最后评论:)

是的,问题是API在服务运行后调用finish,并将所有内容返回给控制器,请参见此处Screencast.com/t/uRKMZ1IgGpb7...这是我的基本问题,我如何等待数据到达的所有部分?

这就像我重复说过的,我们如何创建一个服务,在成功检索数据后填充数组,并在所有这些发生后获取数据的控制器,因为正如你在我的屏幕截图中看到的,事情以不同的顺序运行。

我有这样的代码:

代码语言:javascript
复制
 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返回结果和返回承诺数据所需的时间。

我真的很困惑,在过去的两个小时里,我的头撞到了墙上,因为我的控制器中没有接收到任何数据,只有当我把超时设置在那里的时候。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-07 23:32:36

我想有一种更聪明(也更优雅)的方式可以用$q.all来完成这个任务。

请看一下下面的代码。

我假设您希望立即返回数据,并将所有结果聚合到一个大数组中。

代码语言:javascript
复制
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()

希望这对您有所帮助,或者让我知道您是否需要完整的工作示例,我可以提供一个!:)

票数 60
EN

Stack Overflow用户

发布于 2013-09-07 23:28:52

$http.get调用是异步的,但是您不必等到它们全部完成后才解析延迟的调用。在这里,它使用超时很简单,因为您很幸运,调用有时间在1秒内完成,但这根本不可靠。

我不会在这里重申一个完整的解决方案,但让我们看看my answer中的另一个类似问题。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18673890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档