当你有递归函数时,你知道如何防止重复调用函数吗?
以下是代码:
loadFinalData(id, color){
this.data = this._test.getUrl(id, "white");
this.dataHover = this._test.getUrl(id, "blue");
}
private flux: Subscription;
loadData(id, color) {
if(this.flux) this.flux.unsubscribe();
this.flux = this._test.getData(id, "white")
.subscribe(
res => this.loadFinalData(id, "white"),
err => setTimeout( _ => this.loadData(id, "white"), 5000 )
)
};
这里,我们递归调用loadData函数。
问题是我们有每5秒调用一次的subcribe()部分的错误功能,它永远不会停止(unsubscribe()不起作用。)
答案 0 :(得分:0)
这样的事情对你来说可能会更好。这将尝试3次然后停止:
public loadData(id, color) {
this._test.getData(id, 'white')
.retryWhen(retryObs$ => retryObs$
.zip(Rx.Observable.range(1, 3), (_, i) => i)
.delay(5000))
.subscribe((res) => this.loadFinalData(id, 'white'));
}
您可以使用以下代码段来解决此问题:
(function () {
const attempts = 5;
var obs = Rx.Observable.interval(10)
.do((val) => { if (val > 2) throw val; })
.do((val) => console.log(`Have value: ${val}`))
.retryWhen(retryObs$ => retryObs$
.zip(Rx.Observable.range(1, attempts), (_, i) => i)
.do((attempt) => console.log(`Failed attempt #${attempt}`))
.do((attempt) => {if (attempt === attempts) throw 'Thrown error'})
.delay(100))
.catch((err, obs$) => (console.log(`Received error: ${err}`), Rx.Observable.throw('Rethrown error')));
var sub = obs.subscribe();
setTimeout(() => sub.unsubscribe(), 5000);
})()