2016-08-10 6 views
6

이 질문은 이미 질문했습니다 here. 그러나 질문자의 응용 컨텍스트가 너무 많이 포함되어 있기 때문에 기본 사항을 이해할 수 없습니다. 예를 들어 queryArr 매개 변수가 있습니다. 그것은 무엇을합니까?2 번 각도로 동기식 http 호출을하는 방법

어쨌든 가장 간단한 방법으로 동기식 http 호출을 수행하는 방법에 대한 지침이 필요합니다. 내가 생각해 낸 해결책은 "중첩 된"순서로 관찰 대상을 구독해야한다는 것입니다. 예를 들어, 관측 값 oxoy이 있습니다. oy에서 호출되는 요청의 데이터는 데이터에 의존되어 ox에서 온다 : 내가 가입 범위에서, (I 자바 스크립트를 많이 할, 그리고 약간의 초보자를 생각하지 않는) 기억

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

마지막으로 oy으로 변경하면 xData 또는 yData은 더 이상 볼 수 없습니다. 내가 틀렸다면 나를 바로 잡고 올바른 방향으로 가르쳐주십시오.

이런 종류의 작업을 수행하기위한 "훌륭한"해결책이나 더 좋은 방법이 있습니까?

답변

5

flatMap 연산자를 사용하여 HTTP 요청을 실행하고 응답을 기다리고 다른 응답을 실행할 수 있다고 생각합니다. 여기

는 샘플입니다 : 당신이 subscribe 방법 모두 결과에 액세스 할 수 있도록하려면

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

, 당신이 활용할 수 Observable.forkJoinObservable.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

http 요청,하지만 질문은 간단한 방법을 동기식 http 요청을 만드는 방법,이 답변을 볼 수 없습니다. – Neutrino

+0

http 요청은 동기식이 아니기 때문에 적절한 소프트웨어 디자인 (Observable based)이 필요하며 언급 된 [Observable.forkJoin] (https://www.learnrxjs.io/operators/combination/forkjoin)을 봐야합니다. .html) 연산자를 사용하여 http 호출을 병렬 처리하고 모두 완료되면 구독을 얻습니다. – Markus