2013-04-29 18 views
33

Vorrei effettuare più chiamate Ajax in una catena. Ma vorrei anche massaggiare i dati dopo ogni chiamata prima di effettuare la prossima chiamata. Alla fine, quando le chiamate Tutte e hanno esito positivo, vorrei eseguire un altro codice.Concatenamento chiamate Ajax in AngularJs

Utilizzo il servizio $ http angolare per le chiamate Ajax e vorrei attenermi a ciò.

È possibile?

risposta

51

Sì, questo è gestito in modo molto elegante da AngularJS poiché il suo servizio $http è costruito attorno a PromiseAPI. Fondamentalmente, le chiamate ai metodi $http restituiscono una promessa e puoi concatenare molto facilmente le promesse utilizzando il metodo then. Ecco un esempio:

$http.get('http://host.com/first') 
    .then(function(result){ 
    //post-process results and return 
    return myPostProcess1(result.data); 
    }) 
    .then(function(resultOfPostProcessing){ 
    return $http.get('http://host.com/second'); 
    }) 
    .then(function(result){ 
    //post-process results of the second call and return 
    return myPostProcess2(result.data); 
    }) 
    .then(function(result){ 
     //do something where the last call finished 
    }); 

Si potrebbe anche combinare post-elaborazione e successiva funzione $http così, tutto dipende da chi è interessato ai risultati.

$http.get('http://host.com/first') 
    .then(function(result){ 
    //post-process results and return promise from the next call 
    myPostProcess1(result.data); 
    return $http.get('http://host.com/second'); 
    }) 
    .then(function(secondCallResult){ 
    //do something where the second (and the last) call finished 
    }); 
+3

Grazie Pawel, lo controllerò. In questo momento, ho usato '$ q.all' e sembra che stia facendo quello che voglio. Ma proverò anche questo. – Ketan

+11

@Ketan 'q.all' e la soluzione qui descritta sono 2 cose diverse. 'q.all' è ottimo ma funziona solo per richieste parallele, cioè se non ti interessa il loro ordine e una richiesta non dipende dai risultati di un'altra. Dalla tua domanda ho capito che sei dopo aver incatenato le richieste, dove una richiesta deve terminare, vuoi ispezionare/elaborare i risultati e solo successivamente emettere un'altra richiesta. –

+0

Risulta nel mio particolare problema che era corretto eseguirli in parallelo, ma quello che volevo veramente era eseguire un codice quando tutti erano stati eseguiti. Tuttavia, la tua risposta è ancora valida, perché sono certo che mi imbatterò in questa prima possibile. Accetterò la tua risposta. – Ketan

8

La risposta accettata è buona, ma non spiega il problema e infine i metodi che hanno messo davvero la ciliegina sulla torta. Questo great article on promises mi ha impostato dritto. Ecco un codice di esempio basato su quell'articolo:

$scope.spinner.start(); 

$http.get('/whatever/123456') 
    .then(function(response) { 
    $scope.object1 = response.data; 
    return $http.get('/something_else/?' + $scope.object1.property1); 
    }) 
    .then(function(response) { 
    $scope.object2 = response.data; 
    if ($scope.object2.property88 == "a bad value") 
     throw "Oh no! Something failed!"; 
    return $http.get('/a_third_thing/654321'); 
    }) 
    .then(function(response) { 
    $scope.object3 = response.data; 
    }) 
    .catch(function(error) { 
    // this catches errors from the $http calls as well as from the explicit throw 
    console.log("An error occured: " + error); 
    }) 
    .finally(function() { 
    $scope.spinner.stop(); 
    }); 
Problemi correlati