我试图绕过$ q角库。在我的routeprovider中,我想从服务器获取所有数据并将其存储在localStorage中。但是由于某种原因,解析似乎并没有等待所有http请求完成才路由到selectMedia。根据我对有角度的文档的了解,这应该有效,但事实并非如此。我是否完全误解了这个概念,或者我的想法对吗?

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

最佳答案

我没有在路由定义中看到该路由的控制器。我想您已经通过ngController在视图级别进行了设置。当您在定义中未指定控制器时,将跳过resolve块。

4/23更新

从官方文档中提取的resolve属性的定义:


  可选的依赖关系图,应将其注入到
  控制器。如果这些依赖中的任何一个是承诺,它们将是
  解析并转换为控制器之前的值
  实例化并触发$ routeChangeSuccess事件。


根据定义,resolve属性的设计目的是要有一种方法将依赖项注入与路由关联的控制器中。

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

10-12 13:20