Angular 2,轮询http请求并等待响应缓慢

Mas*_*ani 1 polling rxjs angular

我有一项服务,每 3 秒从服务器获取一次数据。有时服务器很慢,许多响应在 5 或 6 秒后出现。发生这种情况时,我的服务开始取消每个请求,而不是等待挂起的请求。我怎样才能防止这种情况?

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);       
    }
Run Code Online (Sandbox Code Playgroud)

Kwi*_*enP 7

自从您使用 switchMap 以来,您的请求将被取消。如果你想接收每个请求的响应,只需使用mergeMap:

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

这永远不会取消请求,您将收到每个请求的响应。

编辑:如果您想在前一个请求到达后立即执行下一个请求,您可以使用 concatMap。ConcatMap 将取下一个值并处理它。只要不处理前一个值,它就不会使用下一个值(即使它到达)。

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