2016-03-04 51 views
0

在我們的應用程序中,我們從一個服務中獲取數據,這個服務恰好是一個長時間運行的事務(10+秒)。目前我們將它作爲模塊config()中的「Resolve」的一部分進行調用,這會阻塞頁面,直到完全獲取服務數據。AngularJS - 無阻塞預取數據

我們可以通過調用服務而不是阻止頁面執行來預取數據嗎?

+0

服務代碼是否同步運行?因爲同步操作確實會阻止UI –

+2

將它從解析中移除並在頁面控制器內處理它? –

回答

0

在一個不是最近的項目中,我只是讓我在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; 
    }]) 

}();

0

我同意塞蒂亞。爲什麼不直接在控制器內調用它呢?因爲它是一個長期運行的任務,您可以利用第三個功能爲承諾:

myTask.then(function(success) { 
    // Do stuff with the result 
}, function(error) { 
    // Handle error 
}, function(progress) { 
    // Publish progress to the UI 
}); 

這樣你就可以獲取數據,但不能阻止用戶界面。