客户端应用程序向服务器发送请求,这可能需要很长时间才能完成。一旦请求完成或失败,客户端应该等待一段时间(即10秒)然后再次发送请求。
目前的工作解决方案是这样的:
appRequest = new Subject();
ngOnInit(): void {
this.appRequest.delay(10000).subscribe(() => this.refresh());
this.refresh();
}
refresh() {
this.api.getApplications().subscribe(a => {
this.updateApplications(a);
this.appRequest.next();
},() => this.appRequest.next()
);
}
有没有更优雅的解决方案?
EDIT:
我可以定期使用计时器,但我不想发送新的请求,除非先前的请求已完成。只有在上一个请求完成后,我想等待 10 秒,然后再次发送请求。这应该无限期地重复。
getApplications()
函数是由 swagger 生成的,它内部使用 Angular 的 http 客户端库。目前的观察是,除非您订阅Observable
由返回getApplications()
,它不会向服务器发送请求。
The repeatWhen()
运算符似乎是为此设计的,但是 rxjs 风格中缺乏示例和文档。
这是 RxJava 的文档(描述也适用于 RxJs)RxJava的repeatWhen和retryWhen,解释 http://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-retrywhen-explained/.
Uses
使用repeatWhen+delay定期轮询数据:
source.repeatWhen(completed => completed.delay(5000))
您的版本可能是
stopRequesting = new Subject();
ngOnInit() {
this.api.getApplications()
.repeatWhen(completed => completed.delay(10000))
.takeUntil(stopRequesting)
.subscribe(a => this.updateApplications(a))
}
ngOnDestroy() {
this.stopRequesting.next(true);
}
Demo
// log to html output
log = function(x) { document.write(x + "<br />"); };
const stop = new Rx.Subject();
Rx.Observable.interval(500)
.take(2)
.repeatWhen(completed => completed.delay(1000))
.takeUntil(stop)
.subscribe(
x => log(`Next: ${x}`),
err => log(`Error: ${err}`),
() => log('Completed')
);
setTimeout(() => stop.next(true), 10000)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)