在我的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调用而忘记了吗?