当前位置: 首页 > 面试题库 >

AngularJS Promises,$ q,延迟

明利
2023-03-14
问题内容

编辑

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

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

是的,问题在于服务运行后API调用完成,并将所有内容返回给控制器,请参阅此处screencast.com/t/uRKMZ1IgGpb7
…这是我的BASE问题,如何在所有部件上等待数据发送到到达?

这就像我重复说的那样, 在成功完成数据检索之后,我们如何提供服务来填充数组,而在发生所有这些情况后,控制器将获取数据
,因为正如您在我的屏幕快照中所看到的,事情在另一个地方运行订购。

我有以下代码:

 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应该能够等待API返回结果并返回承诺数据的时间。

我真的很困惑,在过去的两个小时里,我一直把头撞在墙上,因为我没有在控制器中收到任何数据,只有当我将超时时间放在那儿时。


问题答案:

恕我直言,我认为有很多聪明(优雅)的方法可以做到这一点$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;
            });
        }
    };
});

您可以在上方看到aggregatedData只有通过完成所有异步调用后,才会生成$q.all

例如,您只需要将该服务作为依赖项包含到您的一个控制器中,然后像这样调用该服务 myService.getAllData()

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



 类似资料:
  • 问题内容: 这是一些基于行为的简单问题,我在下面的示例中在节点上运行时注意到了这些行为: 输出为: 1)为什么要实现在立即对已知值运行回调之前等待?为什么不够智能,以至于第一行在第二行运行之前同步发布其输出? 2)什么是之间的时间流逝和被输出?它是单个进程滴答吗? 3)能否将绩效深深包裹在承诺中而产生绩效问题?例如,即使可以有效地同步解决,它是否也要异步等待3倍的时间才能完成? 问题答案: 这实际

  • Q

    Q-Learning 决策 假设我们的行为准则已经学习好了, 现在我们处于状态s1, 我在写作业, 我有两个行为 a1, a2, 分别是看电视和写作业, 根据我的经验, 在这种 s1 状态下, a2 写作业 带来的潜在奖励要比 a1 看电视高, 这里的潜在奖励我们可以用一个有关于 s 和 a 的 Q 表格代替, 在我的记忆Q表格中, Q(s1, a1)=-2 要小于 Q(s1, a2)=1, 所以

  • q

    描述 (Description) 可以使用此函数代替单引号。 这不是一个真正的函数,更像是一个运算符,但如果你在另一个程序员的程序中看到它而不记住它是什么,你可能会看到这里。 您实际上可以使用任何一组分隔符,而不仅仅是括号。 语法 (Syntax) 以下是此函数的简单语法 - q ( string ) 返回值 (Return Value) 此函数返回单引号字符串。 例子 (Example) 以下

  • 本文向大家介绍PrologCLP(Q),包括了PrologCLP(Q)的使用技巧和注意事项,需要的朋友参考一下 示例 CLP(Q)对有理数进行推理。 例:            

  • Q&A

    1. Q&A

  • Kdb +带有内置的编程语言,即q 。 它包含标准SQL的超集,可扩展用于时间序列分析,并提供许多优于标准版本的优势。 熟悉SQL的人可以在几天内学习q并能够快速编写自己的即席查询。 启动“q”环境 要开始使用kdb +,您需要启动q会话。 启动q会话有三种方法 - 只需在运行终端上输入“c:/q/w32/q.exe”即可。 启动MS-DOS命令终端并键入q 。 将q.exe文件复制到“C:\Wi