Javascript 使用XHR频率过高的RxJs会导致备份请求
我将Javascript 使用XHR频率过高的RxJs会导致备份请求,javascript,angular,typescript,rxjs,backpressure,Javascript,Angular,Typescript,Rxjs,Backpressure,我将ngcli与angular2和RxJs一起使用。我试图做的简单解释是:我使用RxJs不断地对后端REST端点进行XHR。我注意到,如果我制作这些XHR的频率是100ms、500ms,甚至1000ms,通过查看Chrome/FireFox开发者工具的网络视图,我可以看到很多XHR正在等待处理;他们开始的时间从200毫秒到1.5秒不等,但随着XHR数量的增加,这些请求需要10秒到20秒才能完成;它们堆积如山,所有后来的XHR最终都处于待定状态 我的TypeScript代码与RxJs对象一起工作,
ngcli
与angular2
和RxJs
一起使用。我试图做的简单解释是:我使用RxJs不断地对后端REST端点进行XHR。我注意到,如果我制作这些XHR的频率是100ms、500ms,甚至1000ms,通过查看Chrome/FireFox开发者工具的网络视图,我可以看到很多XHR正在等待处理;他们开始的时间从200毫秒到1.5秒不等,但随着XHR数量的增加,这些请求需要10秒到20秒才能完成;它们堆积如山,所有后来的XHR最终都处于待定状态
我的TypeScript
代码与RxJs
对象一起工作,如下所示
private initStreaming(): void {
this.playSubject = new Subject<boolean>();
this.pauseSubject = new Subject<boolean>();
let interval = Observable.interval(100)
.map(() => this.myService.queryTransactions(this.getQueryRequest()))
.flatMap(v => v);
let pause = Observable.from(this.pauseSubject).mapTo(Observable.of(false));
let resume = Observable.from(this.playSubject).mapTo(interval);
this.timer = Observable
.merge(pause, resume)
.startWith(interval)
.switchMap<Observable<boolean> | Observable<QueryResponse>, boolean | QueryResponse>(v => v)
.scan<boolean | QueryResponse, QueryResponse>((acc, curr) => {
if (curr && typeof curr === 'boolean') {
return acc;
} else {
return curr as QueryResponse;
}
}, undefined);
this.subscription = this.timer.subscribe(
data => {
if (undefined !== data && undefined !== data.transactions) {
if (this.queryResponse === undefined) {
this.queryResponse = data;
} else if (this.queryResponse && data) {
if (this.shouldSwap(this.queryResponse, data)) {
this.queryResponse = data;
}
}
}
}
);
}
private initStreaming():void{
this.playpubject=新主题();
this.pauseSubject=新主题();
设区间=可观测区间(100)
.map(()=>this.myService.queryTransactions(this.getQueryRequest()))
.flatMap(v=>v);
让pause=Observable.from(this.pauseSubject).mapTo(Observable.of(false));
让resume=Observable.from(this.playdubject).mapTo(interval);
this.timer=可观察
.合并(暂停、恢复)
.startWith(间隔)
.switchMap(v=>v)
.扫描((附件,当前)=>{
if(curr&&typeof curr==='boolean'){
返回acc;
}否则{
作为查询响应返回当前值;
}
},未定义);
this.subscription=this.timer.subscripte(
数据=>{
if(未定义!==数据和未定义!==数据.事务){
if(this.queryResponse==未定义){
this.queryResponse=数据;
}else if(this.queryResponse&&data){
if(this.shouldSwap(this.queryResponse,data)){
this.queryResponse=数据;
}
}
}
}
);
}
我读过关于websockets
的文章,这可能是将数据(如果在服务器上更改)推送到客户机的更好方法,而不是拉取数据的方法(无论数据在服务器上是否更改)。但这是另一个帖子,国际海事组织
无论如何,关于如何改进此代码有什么想法吗?您需要缓冲区和/或节流。我如何实现这一点?类似于
导入'rxjs/add/operator/debounceTime'代码>然后可观察到。去BounceTime(1000/*ms*/)
应该管理请求的数量。处理这种情况的操作员的数量(有几十个)是很难预测的。我认为正确的去盎司观测值是我的计时器,对吗?是的,我相信是这样