在$ routeProvider解析中返回相互依赖的异步promise

时间:2013-08-02 07:08:27

标签: angularjs promise angularjs-routing

考虑代码:

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个调用依赖于第一个调用。

简而言之,只有在完成所有3次调用后才能加载myAppController。

2 个答案:

答案 0 :(得分: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;

              }
          }]);

答案 1 :(得分: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;
                } 
            }