在我們的應用程序中,我們從一個服務中獲取數據,這個服務恰好是一個長時間運行的事務(10+秒)。目前我們將它作爲模塊config()中的「Resolve」的一部分進行調用,這會阻塞頁面,直到完全獲取服務數據。AngularJS - 無阻塞預取數據
我們可以通過調用服務而不是阻止頁面執行來預取數據嗎?
在我們的應用程序中,我們從一個服務中獲取數據,這個服務恰好是一個長時間運行的事務(10+秒)。目前我們將它作爲模塊config()中的「Resolve」的一部分進行調用,這會阻塞頁面,直到完全獲取服務數據。AngularJS - 無阻塞預取數據
我們可以通過調用服務而不是阻止頁面執行來預取數據嗎?
在一個不是最近的項目中,我只是讓我在Resolve中調用的服務返回承諾。
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;
}])
}();
我同意塞蒂亞。爲什麼不直接在控制器內調用它呢?因爲它是一個長期運行的任務,您可以利用第三個功能爲承諾:
myTask.then(function(success) {
// Do stuff with the result
}, function(error) {
// Handle error
}, function(progress) {
// Publish progress to the UI
});
這樣你就可以獲取數據,但不能阻止用戶界面。
服務代碼是否同步運行?因爲同步操作確實會阻止UI –
將它從解析中移除並在頁面控制器內處理它? –