简体   繁体   English

我如何使用$ q all angular.js处理多个HTTP请求

[英]How do i handle multiple http requests with $q all angular.js

I am trying to wrapp my head around $q angular library. 我试图绕过$ q角库。 In my routeprovider i would like to get all my data from the server and store it in localStorage. 在我的routeprovider中,我想从服务器获取所有数据并将其存储在localStorage中。 But for some reason the resolve dont seem to wait for all http request to finish before routing to selectMedia. 但是由于某种原因,解析似乎并没有等待所有http请求完成才路由到selectMedia。 From my understanding reading the angular docs this should work but it doesn´t. 根据我对有角度的文档的了解,这应该有效,但事实并非如此。 Have i totally missunderstood the concept or am i my thinking right? 我是否完全误解了这个概念,或者我的想法对吗?

         $routeProvider.           
            when('/', {
            redirectTo : '/selectMedia',
            resolve: {  
                data: function ($q, backendApi, localStorage, network, route, loginService){
                    var prices = function () {
                        var defer = $q.defer();
                        backendApi.prices.get(function (data) {
                            localStorage.setItem("videoPrice", data.VideoPrice);
                            localStorage.setItem("imagePrice", data.ImagePrice);
                            localStorage.setItem("prices", data.SliderPrices);
                            localStorage.setItem("priceSuffix", data.PriceSuffix);
                            defer.resolve();
                        }, defer.resolve);  
                        return defer.promise;
                    };
                    var validFormats = function () {
                        var defer = $q.defer(); 
                        backendApi.validFormats.get(function (formats) {
                            localStorage.setItem("validFormats", formats);
                            defer.resolve();
                        }, defer.resolve);
                        return defer.promise;
                    };
                    var videoFormats = function () {
                        var defer = $q.defer(); 
                        backendApi.videoFormats.get(function (videoFormats) {
                            localStorage.setItem("videoFormats", videoFormats); 
                            defer.resolve();
                        }, defer.resolve);
                        return defer.promise;
                    };
                    var categories = function () {
                        var defer = $q.defer();
                        backendApi.categories.get(function (data){
                            localStorage.setItem("categories", data.Categories);
                            defer.resolve();
                        },defer.resolve);   
                        return defer.promise;
                    };
                    var renewToken = function () {
                        var defer = $q.defer();
                        loginService.renewToken(defer.resolve);
                        return defer.promise;
                    };

                    if(network.isOnline()){                 
                        var promises = [renewToken(), categories(), videoFormats(), validFormats(), prices()];
                        return $q.all(promises);
                    }
                    else if(!network.isOnline() && localStorage.length === 0){
                        route('/error');
                    }
                }   
            }
        });
}]);

I don't see the controller for the route being specified in the route definition. 我没有在路由定义中看到该路由的控制器。 I guess you have set it via ngController at the view level. 我想您已经通过ngController在视图级别进行了设置。 The resolve block is skipped when you don't have a controller specified in the definition. 当您在定义中未指定控制器时,将跳过resolve块。

4/23 UPDATE 4/23更新

The definition of the resolve property extracted from the official docs: 从官方文档中提取的resolve属性的定义:

An optional map of dependencies which should be injected into the controller . 可选的依赖项映射,应将其注入到控制器中 If any of these dependencies are promises, they will be resolved and converted to a value before the controller is instantiated and the $routeChangeSuccess event is fired. 如果这些依赖中的任何一个是承诺,则将在实例化控制器和触发$ routeChangeSuccess事件之前将其解析并转换为值。

According to the definition, the design purpose of the resolve property is to have a way to inject dependencies into the controller associated with a route. 根据定义, resolve属性的设计目的是提供一种将依赖项注入与路由关联的控制器中的方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM