2013-03-31 11 views
17

Ich habe einen Controller, der zwei separate REST-Ressourcen abrufen muss, die zwei Dropdown-Felder füllen. Ich möchte es vermeiden, beide zu füllen, bis beide $ http.get() - Aufrufe zurückgegeben wurden, so dass die Dropdown-Listen zur gleichen Zeit gefüllt erscheinen, statt nacheinander zu rinnen.

Ist es möglich, $ http.get() - Aufrufe zu bündeln und die $ scope-Variablen für beide zurückgegebenen Arrays elegant festzulegen, ohne dass für beide Szenarios Statuslogik geschrieben werden muss, z. a returns vor b, b returns vor a?

+1

FYI - der Fragetitel sagt "Kette", aber der Körper beschreibt eine Verbindung. Nicht sicher, ob eine Bearbeitung hier angebracht ist. –

Antwort

36

Der Rückgabewert der Winkel $http Funktion des Aufrufs ist ein Promise Objekt mit $q (ein Versprechen/latente Umsetzung von Kris Kowal's Q inspiriert) .

Werfen Sie einen Blick auf die $q.all(promises) Methode Dokumentation:

mehrere Versprechungen in ein einziges Versprechen Kombiniert, die gelöst wird, wenn alle Eingangs Versprechen gelöst werden.

Parameter

  • Versprechungen - {Array.<Promise>} - Ein Array von Versprechen.

Returns

{Promise} - Liefert ein einziges Versprechen, das Versprechen auf dem gleichen Index in dem Versprechen Array entsprechend mit einer Reihe von Werten, wobei jeder Wert gelöst werden. Wenn einer der promises mit einer Zurückweisung aufgelöst wird, wird diese resultierende Zusage mit der gleichen Zurückweisung aufgelöst.

können Sie $q.all verwenden, um die Ergebnisse Ihrer http Anrufe "join", mit Code ähnlich:

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

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

Was passiert mit dem Fehler()? Wird das in dem Array von Ergebnissen verfügbar sein? – brushleaf

+0

siehe Dokumentation Hinweis auf jede Ablehnung, führt zu einer Ablehnung –

+5

Dies ist nicht "Kette", sondern "gebündelt" – percebus

5

meinst du so etwas wie dieses:

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 
    }); 
} 

Ref: Angular JS Doc

Verwandte Themen