Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用XHR频率过高的RxJs会导致备份请求_Javascript_Angular_Typescript_Rxjs_Backpressure - Fatal编程技术网

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*/)
应该管理请求的数量。处理这种情况的操作员的数量(有几十个)是很难预测的。我认为正确的去盎司观测值是我的计时器,对吗?是的,我相信是这样