2013-08-02 16 views
8

den Code vor:

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

Die Routen:

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

      }); 
     }); 
    } 
}]); 

Above I 2 Anrufe innerhalb einer verschachtelten als Sie hängen von den Daten ab, die vom übergeordneten Aufruf zurückgegeben werden.

Was ich tun möchte: geben Sie den Resolver zurück, wenn alle von ihnen abgeschlossen sind und nicht nur den übergeordneten Aufruf.

Ich kann $ q.all() nicht verwenden, da zwei der Anrufe vom ersten Anruf abhängig sind.

Kurz gesagt, myAppController muss erst geladen werden, nachdem alle 3 Anrufe abgeschlossen wurden.

Antwort

9

Sie sollen Ihr Problem zu lösen .just benutzen Sie den folgenden Beispielcode Verkettungs q Serviceversprechen und $ verwenden sollen sie

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

Hallo Ajay! Danke für die sofortige Antwort. Aber denkst du, dass ich in der Lage wäre, die Daten, die durch den ersten Anruf zurückgegeben werden, an die nachfolgenden Anrufe weiterzugeben, wenn ich die Verkettung verwende? – AlwaysALearner

+0

ja die Daten in jeder dann Funktion sind die Daten von vorherigen –

+0

Chaining nicht sehr gut meinen Bedarf. Ich ging zu verschachtelten Anrufen. Aber $ q hat mir wirklich geholfen, das Ding zu reparieren. Vielen Dank. Abgestimmt! :) – AlwaysALearner

0

Dies funktioniert für mich arbeiten:

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