Angular 2、轮询http请求并等待慢响应
Angular 2, Polling http request and wait for slow responses
我有一项服务每 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);
}
您的请求正在被取消,因为您正在使用 switchMap。如果你想收到每个请求的响应,只需使用 mergeMap:
return Observable.timer(0,3000)
.mergeMap(()=>this._http.post(this._apiUrl,body,options))
.map(res => <IRespWidgets>res.json().data)
.catch(this.handleError);
这永远不会取消请求,您将从每个请求中得到响应。
编辑:如果你想在前一个请求到达时立即执行下一个请求,你可以使用 concatMap。 ConcatMap 将获取下一个值并对其进行处理。只要不处理前一个值,它就不会采用下一个值(即使它到达)。
return Observable.timer(0,3000)
.concatMap(()=>this._http.post(this._apiUrl,body,options))
.map(res => <IRespWidgets>res.json().data)
.catch(this.handleError);
我有一项服务每 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);
}
您的请求正在被取消,因为您正在使用 switchMap。如果你想收到每个请求的响应,只需使用 mergeMap:
return Observable.timer(0,3000)
.mergeMap(()=>this._http.post(this._apiUrl,body,options))
.map(res => <IRespWidgets>res.json().data)
.catch(this.handleError);
这永远不会取消请求,您将从每个请求中得到响应。
编辑:如果你想在前一个请求到达时立即执行下一个请求,你可以使用 concatMap。 ConcatMap 将获取下一个值并对其进行处理。只要不处理前一个值,它就不会采用下一个值(即使它到达)。
return Observable.timer(0,3000)
.concatMap(()=>this._http.post(this._apiUrl,body,options))
.map(res => <IRespWidgets>res.json().data)
.catch(this.handleError);