2013-08-02 10 views
8

Rozważmy kod:

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

trasach:

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

Resolve:

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) { 

      }); 
     }); 
    } 
}]); 

Przede Mam zagnieżdżona 2 połączeń wewnątrz jednego jako są zależne od danych zwróconych przez połączenie rodzica.

Co chcę zrobić: zwrócić Resolver, gdy wszystkie z nich zostały zakończone, a nie tylko połączenie rodzica.

Nie mogę użyć $ q.all(), ponieważ 2 z połączeń są zależne od pierwszego połączenia.

W skrócie, myAppController może być załadowany dopiero po zakończeniu wszystkich 3 połączeń.

Odpowiedz

9

należy używać łańcuchowym obietnicy i $ usługę q, aby rozwiązać swój problem .Just użyć poniższego przykładowego kodu powinno działać

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

Hi Ajay! Dziękuję za natychmiastową odpowiedź. Ale czy myślisz, że będę w stanie przekazać dane zwrócone przez pierwsze połączenie do kolejnych połączeń, jeśli użyję łączenia? – AlwaysALearner

+0

tak dane wewnątrz każdej funkcji są dane zwrócone z poprzedniego –

+0

Łańcuchowanie nie pasowało do mojej potrzeby bardzo dobrze. Poszedłem na połączenia zagnieżdżone. Ale $ q naprawdę pomogło mi to naprawić. Dziękuję Ci. Voted Up! :) – AlwaysALearner

0

Działa to dla mnie:

  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; 
       } 
      } 
Powiązane problemy