8

考虑代码:

var myApp = angular.module('myApp', []);

路线:

myApp.config(['$routeProvider', function($routeProvider) {
        $routeProvider.when('/', {
            templateUrl: 'app.html', 
            controller:myAppController, 
            resolve:{
                resolveData:function(Resolver){
                    return Resolver();
                }
            }
        });
    });

解决:

myApp.factory('Resolver', ['$http', function($http){
    return function(){
        return $http({url: '/someurl',method: "GET"}).then(function(data) {

            // dependent call 1
            $http({url: '/someotherurl',method: "GET" }).then(function(data) {

            });

            // dependent call 2
            $http({url: '/someanotherurl',method: "GET" }).then(function(data) {

            });
        });
    }
}]);

上面我在一个中嵌套了 2 个调用,因为它们依赖于父调用返回的数据。

我想做的是:当所有这些都完成时返回解析器,而不仅仅是父调用。

我不能使用 $q.all() 因为其中 2 个调用依赖于第一个调用。

简而言之,myAppController 必须在所有 3 个调用都完成后才加载。

4

2 回答 2

9

您应该使用链接承诺和 $q 服务来解决您的问题。只需使用下面的示例代码就可以了

 myApp.factory('Resolver', ['$http','$q', function ($http,$q) {
              return function () {
                  var deferred = $q.defer();

                  $http({ url: '/someurl', method: "GET" }).then(function (data) {
                      return $http({ url: '/someurl', method: "GET" })
                  }).then(function (data) {
                      return $http({ url: '/someanotherurl', method: "GET" })
                  }).then(function (data) {
                      deferred.resolve(data);
                  });
                  return deferred.promise;

              }
          }]);
于 2013-08-02T07:25:37.430 回答
0

这对我有用:

            resolve : {
                message: function($q, $route, Restangular) {

                    var msgId = $route.current.params.msgId;
                    var deferred = $q.defer();

                    Restangular.one('message', msgId).get().then(function(message) {
                        Restangular.one('file', message.audioFile.id).get().then(function (blob) {
                            message.blob = blob;
                            deferred.resolve(message);
                        });
                    });
                    return deferred.promise;
                } 
            }
于 2015-04-23T15:10:13.517 回答