Angular Rxjs执行前可观察批处理

Angular Rxjs执行前可观察批处理,angular,rxjs,observable,angular2-observables,Angular,Rxjs,Observable,Angular2 Observables,我正在尝试构建一个函数,该函数获取一个ID,将其发送到服务器并返回响应。 到现在为止,一直都还不错。。问题是此函数可能会被多次调用,因此我希望实现以下功能: 函数get是一个ID,等待3秒钟,然后执行。如果在这3秒钟内传递了另一个ID,请附加到已发送的ID,然后再次开始3秒钟计数。经过3秒后,发送所有ID(在单个请求中),并将响应返回给每个ID发送者 到目前为止,我尝试使用Subject和buffer操作符: batchPlaceBetSubscription:Subject<stri

我正在尝试构建一个函数,该函数获取一个ID,将其发送到服务器并返回响应。 到现在为止,一直都还不错。。问题是此函数可能会被多次调用,因此我希望实现以下功能: 函数get是一个ID,等待3秒钟,然后执行。如果在这3秒钟内传递了另一个ID,请附加到已发送的ID,然后再次开始3秒钟计数。经过3秒后,发送所有ID(在单个请求中),并将响应返回给每个ID发送者

到目前为止,我尝试使用Subject和buffer操作符:

  batchPlaceBetSubscription:Subject<string>=new Subject();
  batchPlaceBetSubscription:Observable<Response>;

  sendToServer(ID: string): Observable<any> {
    this.batchPlaceBetSubscription.next(ID);
    return this.batchPlaceBetSubscription$;

  }

  private placeBetBatchRequests(placeBetItem: IplaceBet[]) {
    this.batchPlaceBetSubscription$ = this.batchPlaceBetSubscription
      .buffer(Observable.timer(0, 3000))
      .take(1)
      .switchMap(IDsArray => {
        debugger;
        return this.http.post('http://someURL,IDsArray)
          .map(res => res.json())
          .catch(e => Observable.throw(e))
      })    
  }
batchPlaceBetSubscription:Subject=newsubject();
BatchPlaceBets订阅:可观察;
sendToServer(ID:string):可观察{
this.batchPlaceBetSubscription.next(ID);
返回此。BatchPlaceBetsSubscription$;
}
private placeBetBatchRequests(placeBetItem:IplaceBet[]){
this.batchPlaceBetSubscription$=this.batchPlaceBetSubscription
.缓冲器(可观察计时器(0,3000))
.采取(1)
.switchMap(IDsArray=>{
调试器;
返回此.http.post('http://someURL,idssarray)
.map(res=>res.json())
.catch(e=>可观察到的.throw(e))
})    
}
这几乎是作品,但是第一个ID被忽略了(我猜是因为当主题“下一个”它时,还没有订户)

那么,我如何批量处理这些ID?
提前感谢。

我不知道如何调用
sendToServer
,但您可以使用
ReplaySubject
进行“BatchPlaceBetsSubscription”,即使没有订阅服务器,它也会记住项目。sendToServer()是从该范围之外(从组件)调用的。我曾想过使用replaySubject,但如何确保它记住所有发出的项,执行它们,然后为下一批清除它的内存?您看过
debounceTime(3000)
?这将重新启动3秒计时器,但它只会发出最新的值,因此您需要添加另一个附加值的运算符。我不知道如何调用
sendToServer
,但您可以使用
ReplaySubject
进行“BatchPlaceBetsSubscription”,即使没有订阅者,它也会记住项目。sendToServer()从该范围之外(从组件)调用。我曾想过使用replaySubject,但如何确保它记住所有发出的项,执行它们,然后为下一批清除它的内存?您看过
debounceTime(3000)
?这将重新启动3秒计时器,但它只会发出最新的值,因此您需要添加另一个附加值的运算符。