如何在不使用已弃用的 retryWhen 的情况下在 RxJs 中延迟重试?

Waj*_*ath 10 javascript rxjs typescript angular

我想延迟(例如 2 秒)重试可观察链。

有一些类似的问题用 回答retryWhen。但retryWhen似乎已被弃用,我不想使用它。

  • 仅当第一次尝试失败时,延迟和重试才适用
  • 如果所有重试都失败,我想用默认数据进行响应。

以下代码可以运行,无需添加延迟,但如何在该链中添加延迟?

of('trigger')
  .pipe(
    switchMap(() => fetchData()),
    retry(5),
    catchError(() => of(returnThisIfRetriesAreFailed))
  )
  .subscribe(console.log);
Run Code Online (Sandbox Code Playgroud)

StackBlitz 条目

我尝试添加delay(2000),但它似乎不起作用。

ggr*_*nig 12

我不确定你的意思

仅当第一次尝试失败时,延迟和重试才适用

我在源代码中找不到任何条件来限制该delay选项仅适用于第一次失败的尝试。

所以你应该能够传递一个固定数字或一个 Observable 作为延迟。例如:

of('trigger')
  .pipe(
    switchMap(() => fetchData()),
    retry({count: 5, delay: 2000}),
    catchError(() => of(returnThisIfRetriesAreFailed))
  )
  .subscribe(console.log);
Run Code Online (Sandbox Code Playgroud)

如果您的意思是只想延迟第一次重试,那么您可以尝试如下操作:

of('trigger')
  .pipe(
    switchMap(() => fetchData()),
    retry({count: 5, delay: (_, retryCount) => retryCount === 1 ? timer(2000) : of({})}),
    catchError(() => of(returnThisIfRetriesAreFailed))
  )
  .subscribe(console.log);
Run Code Online (Sandbox Code Playgroud)


Adn*_*nan 9

您还可以向延迟对象键添加一个方法并执行一些其他检查。我只是粘贴一段代码,以便您明白要点。

// A custom method to check should retry a request or not

shouldRetry(error: HttpErrorResponse) {
    // Example for catching specific error code as well
    if (error.status === 503) {
      return timer(1000); // Adding a timer from RxJS to return observable to delay param.
    }

    throw error;
  }

// Retry operator somewhere in your code
retry({ count: 2, delay: this.shouldRetry })

Run Code Online (Sandbox Code Playgroud)