2013-03-31 12 views
17

Ho un controller che deve recuperare due risorse REST separate che popoleranno due elenchi a discesa. Vorrei evitare di popolarli entrambi fino a quando non sono state restituite entrambe le chiamate $ http.get(), in modo che gli elenchi a discesa appaiano popolati contemporaneamente, invece di scorrere uno dopo l'altro.

È possibile associare le chiamate $ http.get() e impostare elegantemente le variabili $ scope per entrambi gli array restituiti, senza dover scrivere la logica di stato per entrambi gli scenari, ad es. un ritorno prima di b, b ritorna prima di un?

+1

FYI - il titolo della domanda dice "catena" ma il corpo descrive un join. Non sono sicuro che una modifica sia appropriata qui. –

risposta

36

Il valore di ritorno di chiamare la funzione di angolare $http è un Promise oggetto utilizzando $q (un'implementazione promessa/differite ispirato Kris Kowal's Q) .

Date un'occhiata alla documentazione di $q.all(promises) metodo:

combina molteplici promesse in un unico promessa che viene risolto quando tutte le promesse di ingresso sono stati risolti.

Parametri

  • promesse - {Array.<Promise>} - Un array di promesse.

ritorni

{Promise} - restituisce un solo promessa che verrà risolto con una serie di valori, ciascun valore corrispondente alla promessa allo stesso indice nella matrice promesse. Se uno qualsiasi dei promises viene risolto con un rifiuto, la promessa risultante verrà risolta con lo stesso rifiuto.

È possibile utilizzare $q.all a "unire" i risultati delle vostre chiamate http, con codice simile a:

app.controller("AppCtrl", function ($scope, $http, $q) { 

    $q.all([ 
    $http.get('/someUrl1'), 
    $http.get('/someUrl2') 
    ]).then(function(results) { 
    /* your logic here */ 
    }); 
} 
+0

Cosa succede all'errore()? Sarà disponibile nella serie di risultati? – brushleaf

+0

vedere la nota della documentazione su qualsiasi rifiuto, risultati in un rifiuto –

+5

Questo non è "catena" ma "raggruppato" – percebus

5

vuoi dire qualcosa di simile:

function someController($scope, $http, $q) { 
    var first_meth = $http.get("first_url"), 
     second_meth = $http.get("second_url"); 
    $q.all([first_meth, second_meth]).then(function(all_your_results_array) { 
     //here you'll get results for both the calls 
    }); 
} 

Rif: Angular JS Doc

0

Si potrebbe utilizzare la libreria javsscript Async qui: https://github.com/caolan/async.

Utilizzare il numero di serie. Effettua le 2 chiamate e quindi chiama una richiamata quando entrambe le operazioni sono eseguite.

Problemi correlati