【问题标题】:Angular - Make multiple request on app.run()Angular - 在 app.run() 上发出多个请求
【发布时间】:2015-04-10 16:14:14
【问题描述】:

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

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

我的部分代码是:

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;
    }
}

【问题讨论】:

标签: angularjs http promise deferred


【解决方案1】:

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

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

  1. 使用 JS - 使用 $state.go()。见-$State documentation

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

  3. 使用常规 html href(导航到 url) - 使用您需要的状态的完整地址。在你的情况下,“/main”。

希望对你有帮助

【讨论】:

    【解决方案2】:

    让 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;
        };
    

    【讨论】:

    • 还有不使用 $timeout 的替代方法吗?为什么? - 因为我试图加载到 .run() 中的 json 文件可能会花费我在 $timeout 中定义的或多或少的时间。例如,我更改了 getDataSet2 方法 function getDataSet2() { var deferred = $q.defer(); $http({ method: 'POST', url: iProtectEnv.URL_DATA }).success(function(response) { deferred.resolve(response); }).error(function(response) { deferred.reject(response); } );返回 deferred.promise; .run() 工作
    • '但我不需要这个'
    • @julioVG 超时是为了伪造后端服务延迟。将 $q.defer() 替换为您的服务调用。真正的改变是让 ui-router 处理将数据解析到您的控制器。它开辟了更多的可能性,并防止您将状态处理逻辑复制到您的控制器中。 github.com/angular-ui/ui-router/wiki#resolve
    • 重点是:当我启动我的应用程序时,我必须接收一个 json 文件并将其保存到我的 localStorage(老板想要的那个)中,然后再保存我必须查看该 json 文件是否被修改,这意味着发出 HEAD 请求来验证这一点。之后,如果修改了 json,我必须在之后获取 ir(这意味着发出 GET 请求),清理我的 LocalStorage,然后解析该 json 文件并保存到 localStorage。重点:那些 HEAD、GET 请求是承诺,它不能快速解决。我想获取所有信息并保存到 LS 中,所以在所有这些启动我的应用程序之后。有人可以帮我吗?
    猜你喜欢
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    相关资源
    最近更新 更多