2016-08-10 12 views
6

To pytanie zostało już zadane here. Jednakże, ponieważ kontekst aplikacji pytającego jest zbytnio związany z pytaniem, nie mogłem zrozumieć podstaw. Na przykład istnieje parametr queryArr. Co to robi?Jak wykonywać synchroniczne połączenia http w kanciastym 2

W każdym razie potrzebuję trochę wskazówek, jak wykonywać synchroniczne połączenia HTTP w najprostszy sposób. Rozwiązaniem, które wymyśliłem, jest to, że należy subskrybować obserwowalne w kolejności "zagnieżdżonej". Na przykład są obserwowalne: ox i . Dane z wniosku są nazywane w oy jest uzależniona od danych pochodzi z ox:

xData: string = ""; 
yData: string = ""; 

ox.subscribe(
    data => {xData = data;}, 
    error => console.log(error), 
    () => { 
     oy.subscribe(
      data => {yData = xData*data;}, 
      error => console.log(error), 
      () => console.log("aaa") 
     ); 
    } 
); 

Ostatni raz pamiętam (nie robię kodu JavaScript dużo, i jestem trochę newbie), w zakresie, gdzie subskrybowanego do oy, xData lub yData nie można już zobaczyć. Proszę, popraw mnie i wskaż mi właściwy kierunek, jeśli się mylę.

Czy istnieje jakieś "dobre" rozwiązanie lub lepszy sposób na zrobienie tego typu rzeczy?

Odpowiedz

5

Myślę, że można rzucić okiem na operatora flatMap, aby wykonać żądanie HTTP, poczekać na jego odpowiedź i wykonać inną.

Oto przykład:

executeHttp(url) { 
    return this.http.get(url).map(res => res.json()); 
} 

executeRequests() { 
    this.executeHttp('http://...').flatMap(result => { 
    // result is the result of the first request 
    return this.executeHttp('http://...'); 
    }).subscribe(result => { 
    // result is the result of the second request 
    }); 
} 

Jeżeli chcesz mieć dostęp do obu wyników w metodzie subscribe, można wykorzystać Observable.forkJoin i Observable.of:

executeRequests() { 
    this.executeHttp('http://...').flatMap(result => { 
    // result is the result of the first request 
    return Observable.forkJoin([ 
     Observable.of(result), 
     this.executeHttp('http://...'); 
    }).subscribe(results => { 
    // result is the result of both requests 
    let result1 = results[0]; 
    let result2 = results[1]; 
    }); 
} 
+5

To wydaje się być co wielokrotność przykuty http żądań, ale pytanie było proste, jak zrobić synchroniczne żądanie http, którego nie widzę, jak to odpowiada. – Neutrino

+0

Żądanie http nigdy nie będzie synchroniczne, musisz mieć odpowiedni projekt oprogramowania (oparty na obserwacji) i powinieneś rzucić okiem na wspomniany [Observable.forkJoin] (https://www.learnrxjs.io/operators/combination/forkjoin .html) operator w celu zrównoleglania wywołań http i uzyskania subskrypcji, gdy wszystkie zostaną zakończone. – Markus

Powiązane problemy