如何防止在Angular 5中调用递归错误函数?

时间:2018-02-28 23:02:00

标签: typescript angular5

当你有递归函数时,你知道如何防止重复调用函数吗?

以下是代码:

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()不起作用。)

1 个答案:

答案 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);
})()

更多信息可以在RX书中找到:https://xgrommx.github.io/rx-book/content/getting_started_with_rxjs/creating_and_querying_observable_sequences/error_handling.html