Angular - 在app.run()上发出多个请求

时间:2015-02-10 15:02:28

标签: angularjs http promise deferred

在我的应用上,我需要通过在我的所有应用启动之前使用http请求进行多次验证来恢复数据(json)。所以我的问题是我正在使用angular.run()来制作所有的http请求并使用promises解析所有的验证。

问题是,在我的应用程序启动之前,并非所有的承诺都已执行。

我的部分代码是:

appModule.run(configRun);

configRun.$inject = [
'$http', '$rootScope', 'gettextCatalog', 'ipLoadDataService',
'webStorageService', 'ipDataSetParserService'];

function configRun($http, $rootScope, gettextCatalog, ipLoadDataSrv, webStrSrv, dataSetParser) {
    webStrSrv.clear();

    ipLoadDataSrv.getHeadDataSet2()
        .then(function (responseHead) {

            if (ipLoadDataSrv.updatedDataSet2(responseHead.headers["last-modified"])) {

                //save into localstorage
                webStrSrv.clear();
                webStrSrv.setItem("last-modified", { date: responseHead.headers["last-modified"] });

                ipLoadDataSrv.getDataSet2()
                    .then(function (responseData) {

                        $rootScope.cabecera = responseData;
                    })
            }
        })
}

// LoadDataService
appModule.factory('ipLoadDataService', loadDataService);

loadDataService.$inject = ['$http',
    '$q',
    'webStorageService',
    'myPrjEnvironment',
    'ipDataSetParserService'];

function loadDataService($http, $q, webStoreService, myPrj, dataSetParser) {
    var eventMap = [];

    var ip_loadDataService = {
        getHeadDataSet2: getHeadDataSet2,
        requestDataSet: requestDataSet,
        updatedDataSet2: updatedDataSet2,
        getDataSet2: getDataSet2
    };

    return ip_loadDataService;

    function getHeadDataSet2() {
        /*HEAD*/
        var deferred = $q.defer();

        $http.head(myPrj.URL_DATA)
            .success(function (data, status, headers, config) {
                var response = [];
                response.data = data;
                response.headers = headers();
                deferred.resolve(response);

                //return deferred.promise;

            }).error(function (data, status) {
                deferred.reject(data);
            });
        return deferred.promise;
    }

    function getDataSet2() {
        return xhr('get', [myPrj.URL_DATA]);
    }

    function updatedDataSet2(last_date_modified) {
        //var self = this;
        var dateOnWebStore = webStoreService.getItem("last-modified");

        if (dateOnWebStore === null || Date.parse(dateOnWebStore.date) < Date.parse(last_date_modified))
            return true;

        return false;
    }

    function xhr(type, config) {
        if (!config && angular.isArray(type)) {
            config = type;
            type = 'get';
        }
        var deferred = $q.defer();
        $http[type].apply($http, config)
            .success(function (data, status, headers, config) {
                var response = [];
                response.data = data;
                response.headers = headers();
                deferred.resolve(response);
            })
            .error(function (error) {
                deferred.reject(error);
            });
        return deferred.promise;
    }
}

2 个答案:

答案 0 :(得分:2)

在第二篇文章中回答这个问题,也许您最好使用遇到的新问题编辑原始帖子。

如果您正在寻找的是一种激活状态的方法(在您的情况下为home.myPrjMain),您可以通过各种方式执行此操作:

  1. 使用JS - 使用$ state.go()。请参阅 - $State documentation

  2. 使用指令 - 使用带有所需状态名称的ui-sref指令。请参阅 - ui-sref documentation

  3. 使用常规html href(导航到网址) - 使用您需要的完整地址。在您的情况下,&#34; / main&#34;。

  4. 我希望这很有用

答案 1 :(得分:0)

让UI以初始加载状态启动,然后使用ui-router等待各个部分解析,然后再进入初始状态。

这是一个显示它是如何工作的小提琴。 Fiddle

我做了两个部分,一个是使用超时的单个虚假服务调用,另一个是使用链式调用的第二个部分。

 this.slowServiceCall = function(input, delay) {
        var deferred = $q.defer();
        var workFinished = function () {
            deferred.resolve(input);
        };
        $timeout(workFinished, delay);
        return deferred.promise;
    };

this.slowChainedServiceCall = function(input, delay) {
        var deferred = $q.defer();        
        var workFinished = function () {
            deferred.resolve(input);
        };
        $timeout(workFinished, delay);
        var promiseChain = deferred.promise.then(function(result) {
            var deferred2 = $q.defer();
            $timeout(function(){
                deferred2.resolve(result + ' Second Piece');
            },100);
            return deferred2.promise;
        });
        return promiseChain;
    };