Angular2: Dynamische synchrone http-requests
Ziel: eine Reihe von synchronen http-Anfragen und in der Lage sein, zu abonnieren, um Sie als eine wahrnehmbare stream.
Beispiel (Funktioniert Nicht):
let query_arr = ['test1','test2','test3']
function make_request(query_arr){
if (query_arr.length){
let payload = JSON.stringify(query_arr[0]);
let headers = new Headers();
query_arr.splice(0,1);
this.http.post('https://endpoint/post',payload,{headers:headers})
.map((res:Response) => {make_request(query_arr)})
}
}.subscribe(
data => console.log('finished http request, moving on to next http request'),
err => console.error(err),
() => console.log('all http requests have been finished')
);
make_request(query_arr)
Ziel Funktionalität:
- Wissen müssen, wenn bei jeder Antwort zurückgegeben wurde
- Müssen wissen, wenn alle Antworten, die Sie zurückgegeben haben
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie nutzen, die
flatMap
operator zur Ausführung Ihrer Anfragen in Serie (hintereinander). Für diese, müssen Sie bauen Sie Ihren Datenverarbeitung-chain-rekursiv. Der Punkt ist hier zu nennen die Betreiber auf der vorherigen beobachtbar ist (die eine kehrte von der vorherigen Anfrage).Diese Weise wird die Anforderung warten, bis die vorhergehende abgeschlossen sein, bevor Sie ausgeführt selbst. Die rückrufinformationen bei der Anmeldung wird aufgerufen, wenn alle Anfragen wurden ausgeführt.
Hier ist ein Beispiel für die Implementierung dieses Ansatzes:
Diese Methode kann aufgerufen werden, zunächst so:
Sehen diese plunkr: https://plnkr.co/edit/adtWwckvhwXJgPDgCurQ?p=preview.
Gab es ein paar syntaktische Fehler im code sowie, die angesprochen werden müssten. Aber diese beiseite, Sie vereinfachen erheblich durch die Verwendung
concatMap
+defer
statt.Die grundlegende Idee dabei ist, dass es konvertiert die Abfrage-array in einen Beobachtbaren dann wird es eifrig erstellen Sie eine Reihe von faul-Anforderungen, die nur dann ausgeführt werden, wenn Sie Sie abonniert haben. Jedoch, durch das einwickeln von der post in einem
defer
jede Anfrage wird nur ausgelöst, wenn die vorhergehende abgeschlossen ist.Oder eine nicht rekursive version in Maschinenschrift, wo Sie geben ein array zu forkjoin
in der Rückkehr observableObj(res.json()) Sie wissen, jede Antwort, wenn Sie wieder aus dem httpcall
in der abonnieren, Sie wissen, wenn alle Antworten zurückgegeben und ein array von Werten