2016-11-11 10 views
0

3 초마다 서버에서 데이터를 가져 오는 서비스가 있습니다. 때때로 서버가 매우 느리고 많은 응답이 5 또는 6 초 후에옵니다. 이렇게되면 내 서비스가 보류중인 요청을 대기하는 대신 각 요청을 취소하기 시작합니다. 어떻게 방지 할 수 있습니까?각도 2, 폴링 HTTP 요청 및 느린 응답 대기

public getCallDiagnostic():Observable<IRespWidgets>{ 

     let body = JSON.stringify({manager:"CallDiagnosticServiceManager", 
            action:"GetCallDiagnostic", 
            WEB_USER_TOKEN:this._authenticationService.getUserToken()});  
     let options = new RequestOptions({headers: new Headers({'Content-Type': 'application/json'})}); 

     return Observable.timer(0,3000) 
       .switchMap(()=>this._http.post(this._apiUrl,body,options))      
       .map(res => <IRespWidgets>res.json().data)   
       .catch(this.handleError);  
    } 

답변

2

switchMap을 사용 중이므로 요청이 취소됩니다.

return Observable.timer(0,3000) 
      .mergeMap(()=>this._http.post(this._apiUrl,body,options))      
      .map(res => <IRespWidgets>res.json().data)   
      .catch(this.handleError);  

이 요청을 취소하지 않습니다 그리고 당신은 모든 요청의 응답을 다시 얻을 것이다 : 당신은 모든 요청의 응답을 수신 할 경우에, 다만 mergeMap를 사용합니다.

편집 : 이전 요청이 도착하자 마자 다음 요청을 수행하려는 경우 concatMap을 사용할 수 있습니다. ConcatMap은 다음 값을 취하여 처리합니다. 이전 값이 처리되지 않는 한 다음 값 (도착하더라도)을 취하지 않습니다.

return Observable.timer(0,3000) 
      .concatMap(()=>this._http.post(this._apiUrl,body,options))      
      .map(res => <IRespWidgets>res.json().data)   
      .catch(this.handleError);  
+0

감사합니다. 이전에 도착한 경우에만 요청을 보내는 것이 더 좋은 방법은 무엇입니까? –

+0

@KwintenP 내가 여기서 해낸 것처럼 할 수 있습니다 : http://plnkr.co/edit/6fBPFCus3HhZmCFBXFKq Ofcourse 저는 모든 요청이 완료 될 때까지 기다려야하는 요구 사항만을 말합니다. –

+0

사용하지 않을 것이라고 생각합니다. repeat는 이전 요청이 끝나면 다음 요청을 시작하기 만합니다. – KwintenP