在我们的应用程序中,我们从服务中获取数据,该服务恰好是一个长时间运行的事务(10秒以上)。目前我们将它作为模块config()中“Resolve”的一部分调用,这会阻止页面,直到完全获取服务数据。
我们可以通过调用服务预取数据但不阻止页面执行吗?
答案 0 :(得分:0)
我同意Cetia。为什么不在控制器内调用它?因为它是一个长期运行的任务,你可以使用承诺的第三个函数:
myTask.then(function(success) {
// Do stuff with the result
}, function(error) {
// Handle error
}, function(progress) {
// Publish progress to the UI
});
这样您就可以获取数据但不会阻止UI。
答案 1 :(得分:0)
在一个不那么近期的项目中,我只是让我在Resolve中调用的服务返回promises。
var resolve = {
localize : 'localize',
AttackService : 'AttackService.promise',
CharacterService : 'CharacterService.promise',
StateRestorer: 'StateRestorer'
};
~function(){
"use strict";
/**
* @class EVD.services.StateRestorer
*
* For now where we load up all the state about our hero, etc when we
* refresh the game
*
**/
EVD.modules.service
.factory('StateRestorer', ['models', 'HeroAPI', 'BattleAPI', '$rootScope','$q',
function(models, HeroAPI, BattleAPI, $rootScope, $q) {
var principal;
var fns = []; //List of functions to execute
principal = HeroAPI.principal();
fns.push(principal);
var character = HeroAPI.character();
fns.push(character.$promise);
var mounted = HeroAPI.mounted();
fns.push(mounted.$promise);
var recentKills = BattleAPI.recentKills();
fns.push(recentKills.$promise);
var deferred = $q.defer();
$q.all(fns).then(
function(data) {
$rootScope.user = data[0];
EVD.common.extractPayload(models.get('playerState.character'), data[1]);
EVD.common.extractPayload(models.get('playerState.equipment'), data[2]);
models.set('playerState.recentKills', data[3].result);
deferred.resolve();
}
);
return deferred.promise;
}])
}();