我怎么能重试后捕获

How can i retry after catch?

本文关键字:重试 怎么能      更新时间:2023-09-26

如何在catch后重试?

我想在catch方法后自动重试我的observable,而不调用另一个订阅。我该怎么做呢?

我现在有这样的东西:

intercept(observable: Observable<Response>): Observable<Response> {
        return observable.catch((err, source) => {                
                return this.refreshToken()
                    .flatMap(res => {
                        if (res.status === 200) {
                            return observable;
                        }
                        return Observable.throw(new Error('Can''t refresh the token'));
                    });
        });
    }

因此,当我有我的可观察对象并调用subscribe时,它将捕获错误->刷新令牌->,然后返回可观察对象,我必须调用另一个订阅。我不想那样做。我怎样才能使它与之前的订阅一起工作呢?

调用示例看起来像这样:

let request = this.http.request(url);
intercept(request).subscribe(res => { //do something });

有几个操作符可以与catch结合使用来处理重审/重复操作。它们是有用的操作符,它们允许你有条件地重新订阅已经终止的可观察对象。retryWhen的官方文档:

在通知器出错时重复源可观察序列发出下一个值。如果源可观察到错误和通知器完成后,它将完成源序列。

附加信息:

  • retryWhen,
  • repeatWhen

你可以从前面的问题中找到一些例子:

    在http请求中使用' retryWhen '
  • 如何在RxJs中只重试由源可观察对象发出的某些错误
  • 如何建立一个rx轮询器等待一些间隔后,以前的ajax承诺解决?

选自第二个SO问题:

src.retryWhen(function (errors) {
    // retry for some errors, end the stream with an error for others
    return errors.do(function (e) {
        if (!canRetry(e)) {
            throw e;
        }
    });
});