AngularJS - 无阻塞地预取数据

时间:2016-03-04 14:02:23

标签: angularjs

在我们的应用程序中,我们从服务中获取数据,该服务恰好是一个长时间运行的事务(10秒以上)。目前我们将它作为模块config()中“Resolve”的一部分调用,这会阻止页面,直到完全获取服务数据。

我们可以通过调用服务预取数据但不阻止页面执行吗?

2 个答案:

答案 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;
    }])

}();