Angular RxJs可观察到的避免请求,直到我得到先前的响应

时间:2019-12-17 13:09:46

标签: javascript angular api rxjs observable

我的工厂是

public InsertUpdateTemp(sysObj): Observable<any> {
        return this.http.post(this.appSettings.API_Config '/saveEntryTmp', sysObj)
    }

这是我的电话

  this.saveservice.InsertUpdateTemp(TempSaveUpdate).subscribe(RtnData => {
          //ok response
     },error => {
          //error response
  })

我的工厂正在正确地正确保存数据

我的问题是 假设我的服务器响应缓慢,它将再次发送请求,因此保存了两个条目 如何避免这种情况并且在我之前的请求完成之前不允许其他请求

我该如何实现? 我要避免请求,直到得到上次答复为止

如果我的问题无法理解,请告诉我。.

谢谢

3 个答案:

答案 0 :(得分:0)

您可以使用全局变量(例如:isWaitingResponse,默认情况下为假)。

然后在您的函数中:

if(!this.isWaitingResponse) {
  this.isWaitingResponse = true;
  this.saveservice.InsertUpdateTemp(TempSaveUpdate).pipe(
    finalize(() => this.isWaitingResponse = false)
  )subscribe(RtnData => {
          //ok response
     },error => {
          //error response
  })
}
  根据您所使用的RxJS版本,

最终确定可以被命名为最终   正在使用。

答案 1 :(得分:0)

实际上,您想要的是将服务“处理”保存操作和将这些操作逐一“排队”处理的方法的组合。下面的代码是没有AngularJ的RxJ,请根据需要适用于您自己的情况:

// somewhere in constructor of your singleton service
const saveDataSubject = new Subject();
saveDataSubject.pipe(
  concatMap((enqueuedItem) => this.http.post(this.appSettings.API_Config '/saveEntryTmp', enqueuedItem.data).pipe(
    tap(result => enqueuedItem.callback(undefined, result), error => enqueuedItem.callback(error,undefined)),
    catchError(err => empty()),
  )
)
.subscribe();

public InsertUpdateTemp(sysObj): Observable<any> {
  return new Observable(sub => {
    saveDataSubject.next({data: sysObj, callback: (err, result) => {
      if(err) {
        return sub.err(err);
      }
      sub.next(result);
      sub.complete();
    }});
  });
});

由于该服务是单例服务,因此它连接了一系列更改以保留到后端(使用Subject)。 concatMap的使用将确保更改将被一个接一个地处理。 catchError只是为了防止在提交更改时出错,从而破坏了Observable流,使您无法处理下一个要保留的值。

要从排队的操作中将值(或错误)返回到您的InsertUpdateTemp的被调用方中,需要进行一些魔术操作-这是通过使用Observable(以便将数据实际“插入”到队列是懒惰的,直到您订阅它为止),并通过流的处理调用回调-由于InsertUpdateTemp()的结果,该队列被转换回Observable值发射或错误发射。

答案 2 :(得分:-1)

如果您想通过rxjs进行更多操作,我建议您使用rxjs库中带有throttleTimesample之类的管道。在throttleTime中,您设置了下一个请求的处理时间,但对我来说,我将使用sample,因为它可以让您控制何时发出下一个值。还有其他方法可以执行此操作,如果您想检查其他运算符并提出自己的解决方案,请在rxjs docs处进行检查。