2017-04-09 1 views
4

주어진 간격 (5 초마다)으로 로그를 폴링하는 서비스를 만들려고합니다. http GET 호출을해야하지만 느린 연결과 큰 로그의 경우 switchMap은 이전 보류중인 요청을 취소합니다. 따라서 요청이 취소됨에 따라 로그가 표시되지 않습니다.Rxjs Observable Interval and Angular2 HTTP : 응답 대기

getLog(url:string):Observable<string> { 
    return Observable 
     .timer(0, 5000) 
     .switchMap(() => this.get(url)) 
     .retryWhen(error => error.delay(5000)) 
     .map((res:Response) => res.text()) 
     .catch(e => { 
      console.warn(e.toString()); 
      return Observable.from(""); 
     }); 
} 

this.get(url) 단순히 get(url) {return this.http.get(url)}입니다.

타이머 기능을 유지하려고하지만 이전 호출이 해결 될 때까지 다른 http 호출을 시작하지 말고 대기중인 호출을 취소하지 않으려합니다.

+0

[RxJava에서 플랫 맵과 스위치 맵의 차이점은 무엇입니까?] (http://stackoverflow.com/questions/28175702/what-is-the-difference-between-flatmap-and-switchmap-in- rxjava) – jonrsharpe

+0

또 다른 방법은'flatMap'을 사용하는 것입니다. – jonrsharpe

+0

@jonrsharpe'flatMap'은 새로운 요청을 계속 생성합니다. 보류중인 요청이 완료 될 때까지 새 요청을 생성하고 싶지 않습니다. – bomba6

답변

3

switchMap() 대신 concatMap()을 사용하십시오.

당신이 말한대로 switchMap() 연산자는 이전 요청을 취소합니다. flatMap() (또는 mergeMap()) 연산자는 Observable을 새로 생성하고 즉시 Observable에 모두 가입합니다.

한편, concatMap() 연산자는 이전 Observable이 완료 될 때까지 대기 한 후 다음 Observable에 가입합니다. 따라서 타이머가 요청이 완료되는 것보다 빠르게 진행되는 경우에도 항상 동일한 순서로 모든 응답을 받게됩니다.

관련 문제