2016-10-17 2 views
2

autorefresher Observable을 구독 할 때마다 x 초마다 쿼리를 보내고 다른 요청을 보내기 전에 마지막 요청이 완료되었는지 확인하고 싶습니다. .Rxjs : X 초마다 Ajax 호출 반복, 마지막 하나 완료 완료

let autoRefresher = new Observable().exhaustMap(() => Observable.defer(() => { 
    return someService.returningAPromise(); 
}).timeout(refreshIntervalInMs).repeat()); 

더 좋은 방법이 있나요? 매번 새로운 관찰 가능 항목을 만들지 않고 새로 고침 간격을 업데이트하려면 어떻게해야합니까?

답변

5

나는 이런 식으로 할 거라고 : http://plnkr.co/edit/7HAib10r6Vdl1x2U2wFS

이 무작위로 3 초 지연을 만드는 :

import {Observable} from 'rxjs'; 

function doRequest() { 
    if (Math.random() < 0.25) { 
    return Observable.of('HTTP Response').delay(3000); 
    } else { 
    return Observable.of('HTTP Response'); 
    } 
} 

let autoRefresher = Observable.timer(0, 1000) 
    .exhaustMap(doRequest) 
    .subscribe(response => { 
    console.log(response); 
    }); 

라이브 데모를 참조하십시오. 운영자 timer()은 주기적으로 값을 방출합니다. 그런 다음 exhaustMap()은 이전 Observable을 구독하고 현재 Observable이 완료 될 때까지 방출 된 Observables를 모두 무시합니다. 따라서 timer()은 값을 표시하지만 이들은 exhaust()에 의해 무시됩니다.

Btw, 제가 TypeScript를 사용 중입니다.

+0

내가 생각했던 것보다 니스가 더 간단합니다. 관심 없어 Math.random()은 무엇인가? – sqwk

+0

@sqwk 중복되는 요청을 시뮬레이트하기 위해서입니다. – martin