异步解析我将来需要的AngularJS服务

时间:2015-04-28 12:13:13

标签: javascript angularjs asynchronous angular-ui-router angular-promise

在我的AngularJS应用程序中的几个地方,我需要从Web服务中获取一些基本值。这是一个有点遗留的电话,需要几秒钟的时间。对数据进行的任何更改都会在创建后立即保存,并且在会话中不需要对此进行任何其他调用。

我认为最好的方法是在应用程序启动时进行调用,并在后台执行此操作,稍后当用户移动到依赖状态时,它应该已经解决。我不确定这是不是一个好主意,我想到了两个关于这个的问题。

1)我应该在哪里初始化服务,以便它能够直接发生,但不会阻止MainCtrl等的解析。

2)如果在完全初始化服务之前调用依赖状态(例如,在依赖状态下刷新),我将需要等待解析,我是否可以在该状态下以某种方式获取承诺,即使服务也是如此已经开始初始化(可能在某处存储了promise对象)?

依赖状态有另一个服务依赖于像这样的长期调用值:

resolve: {
            value: function (serviceWithLongCall) {
                return serviceWithLongCall.call();
            },
            halfvalue: function (value, halfingservice) {
                return halfingservice.halfer(value);
            }
        }

这是一个小提琴,显示了第二个控制器上等待时间过长的问题,如果用户等待主页上的4秒,我试图完成第二个状态的等待时间。

http://jsfiddle.net/IngoVals/gsj6ve6o/1/

修改

app.factory('longcallingService',
        function ($resource, $q) {
            var thevalues = {};
            var deferred = $q.defer();

            var longcallingService = {
                initialize: initialize,
                getData: getData
            }

            return longcallingService;

            function initialize() {
                $resource('api/getmy/values').get({}).$promise.then(function (data) {
                    thevalues = data;
                    deferred.resolve(thevalues);
                });
            }

            function getData() {
                return deferred.promise;
            }
        });

我在app.run中调用初始化方法,它主要按预期工作。如果我等待的时间足够长,解决getData()方法的后期状态会立即解决。

然而,在应用启动期间,它似乎正在等待initialize()方法。难道它不仅仅是激活API调用而忘记了吗?

0 个答案:

没有答案