2013-08-02 11 views
8

Si consideri il codice:

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

Le rotte:

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

      }); 
     }); 
    } 
}]); 

Sopra ho nidificato 2 chiamate all'interno di uno come dipendono dai dati restituiti dalla chiamata genitore.

Cosa voglio fare: restituire il Resolver quando tutti hanno completato e non solo la chiamata genitore.

Non riesco a utilizzare $ q.all() perché 2 delle chiamate dipendono dalla prima chiamata.

In breve, myAppController deve essere caricato solo dopo che tutte e 3 le chiamate sono state completate.

risposta

9

Si deve usare il concatenamento promessa e $ q servizio per risolvere il problema .solo utilizzare il codice di esempio riportato di seguito dovrebbe funzionare

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! Grazie per la risposta immediata. Ma pensi che sarei in grado di passare i dati restituiti dalla prima chiamata alle chiamate successive se utilizzo il concatenamento? – AlwaysALearner

+0

sì, i dati all'interno di ogni funzione sono i dati restituiti dal precedente –

+0

Il concatenamento non si adatta molto bene alle mie esigenze. Sono andato per le chiamate annidate. Ma $ q mi ha davvero aiutato a sistemare la cosa. Grazie. Votato! :) – AlwaysALearner

0

Questo funziona per me:

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