【问题标题】:Retry subscribe when the result is false结果为假时重试订阅
【发布时间】:2019-03-29 07:15:08
【问题描述】:

我想继续重试对服务器的调用(看看它是否返回真)。

在我的服务中,我创建了一个 http 调用,如果它能够检索到一个值,则返回 true,当它无法检索到一个值时返回 false(因此会出现错误)。

public retryServerCheck(): Observable<boolean> {
 return this._httpClient.get<boolean>(this.baseUrl + 'ServerCheck')
  .pipe(
    map(() => true),
    catchError(() => of(false)
    ));
}

在我的组件中,我想重试此操作,直到我返回 true,这就是我的问题。

this._serverService.retryServerCheck()
  .subscribe(
    (isOnline) => {
      if (isOnline) {
        this._helperServer.navigateToComponent('Login', undefined, 0);
        console.log('online');
      } else {
        this.lastRetry = 'A little later...';
        console.log('offline');
      }
    }
  );

我尝试在订阅前添加一个管道,但没有成功

this._serverService.retryServerCheck()
  .pipe(
    retry(10),
    delay(100)
  ).subscribe(
    (isOnline) => {
      if (isOnline) {
        this._helperServer.navigateToComponent('Login', undefined, 0);
        console.log('online');
      } else {
        this.lastRetry = 'A little later...';
        console.log('offline');
      }
    }
  );

我能够在我的服务中进行重试,但是我无法在我的组件中对其做出反应

 public retryServerCheck(): Observable<boolean | HttpError> {
  return this._httpClient.get<boolean>(this.baseUrl + 'ServerCheck')
    .pipe(
      retryWhen(errors => errors.pipe(delay(500))),
      catchError(err => {
        return this._helperService.handelHttpError(err);
      })
    );
}

【问题讨论】:

  • 你尝试了retry(1)函数而不是retryWhen()

标签: javascript angular typescript rxjs


【解决方案1】:

catchErrorretryWhen 都将抑制流中的错误。所以在组件中的错误已经被处理了。

尝试让retryWhen负责处理重试次数

// service
public retryServerCheck() {
  return this._httpClient.get(this.baseUrl + 'ServerCheck').pipe(
    retryWhen(error$ => error$.pipe(
      take(10),   // <-- number of retries
      delay(500),
      concat(
        /* either throw your own error */
        throwError('no more retries left')
        /* or to pass original error -- use `NEVER` */
        // NEVER
      )
    ))
  )
}

// component
this._serverService.retryServerCheck()
  .subscribe({
    next: (result) => {
      // succeeded
    },
    error: (error)=> {
      // failed
    }
  });

Run this example

expand 添加到组件——当您在流中有false 时重试。

阅读更多关于rxjs error handling and specifics of retryWhen

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2021-09-02
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多