我的工厂是
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
})
我的工厂正在正确地正确保存数据
我的问题是 假设我的服务器响应缓慢,它将再次发送请求,因此保存了两个条目 如何避免这种情况并且在我之前的请求完成之前不允许其他请求
我该如何实现? 我要避免请求,直到得到上次答复为止
如果我的问题无法理解,请告诉我。.
谢谢
答案 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库中带有throttleTime
或sample
之类的管道。在throttleTime
中,您设置了下一个请求的处理时间,但对我来说,我将使用sample
,因为它可以让您控制何时发出下一个值。还有其他方法可以执行此操作,如果您想检查其他运算符并提出自己的解决方案,请在rxjs docs处进行检查。