2013-08-02 50 views
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個調用完成後才能加載。

回答

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; 

       } 
      }]); 
+0

嗨阿賈伊!感謝您的即時回覆。但是,如果我使用鏈接,您是否認爲我可以將第一次調用返回的數據傳遞給後續調用? – AlwaysALearner

+0

是每個函數裏面的數據都是從前面返回的數據 –

+0

鏈接並不適合我的需要。我去了嵌套呼叫。但$ q確實幫助我解決了這個問題。謝謝。投票了! :) – AlwaysALearner

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; 
       } 
      }