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

标签 javascript angularjs q

我正在尝试围绕 $q angular 库进行思考。在我的路由提供者中,我想从服务器获取所有数据并将其存储在 localStorage 中。但出于某种原因,解析似乎不等待所有 http 请求在路由到 selectMedia 之前完成。根据我阅读 Angular 文档的理解,这应该可以工作,但事实并非如此。我是完全误解了这个概念还是我的想法是对的?

         $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');
                    }
                }   
            }
        });
}]);

最佳答案

我没有看到路由定义中指定的路由 Controller 。我猜你已经在 View 级别通过 ngController 设置了它。当您没有在定义中指定 Controller 时,将跳过 resolve block 。

4/23 更新

从官方文档中提取的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.

根据定义,resolve 属性的设计目的是有一种方法可以将依赖项注入(inject)与路由关联的 Controller 。

关于javascript - 我如何使用 $q all angular.js 处理多个 http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16150371/

相关文章:

javascript - 在这种情况下我如何使用 javascript 创建一个 Promise 函数

javascript - 如何在每个 karma/ Jasmine 测试文件的开头引导 Angular ?

angularjs - 使用 Angular JS 加载图像后更新 DIV 元素

javascript - 使用 Strongloop 环回实现 Q

javascript - 使用 Q promises 串行执行

javascript - 是否可以清理 Javascript 代码?

javascript - Node.js async.series() 不等待回调完成

javascript - 如何使用纯Javascript检查单击的元素是否具有背景属性?

javascript - 使用 Angular UI 路由器突出显示事件嵌套状态

Javascript、 Node 、Q promises、原型(prototype)函数和 "this"