簡體   English   中英

如何在不使用已棄用的 retryWhen 的情況下延遲 RxJs 重試?

[英]How can I retry with a delay in RxJs without using the deprecated retryWhen?

我想延遲重試一個可觀察的鏈(比如 2 秒)。

retryWhen回答了一些類似的問題。 但是retryWhen似乎已被棄用,我不想使用它。

  • 延遲和重試僅在第一次嘗試失敗時適用
  • 如果所有重試都失敗,我想用默認數據響應。

以下代碼有效,但不添加延遲,但是如何在此鏈中添加延遲?

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

StackBlitz 條目

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

我不確定你的意思

延遲和重試僅在第一次嘗試失敗時適用

我在源代碼中找不到任何將delay選項限制為僅適用於第一次失敗嘗試的條件。

因此,您應該能夠將固定數字或 Observable 作為延遲傳遞。 例如:

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

如果你的意思是你只想延遲第一次重試,那么你可以嘗試這樣的事情:

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

利用:

of('trigger').pipe(
    switchMap(() => fetchData()),
    catchError((err, caught) => caught.pipe(
                    repeat({ count: 1, delay: 2000 }),
                    catchError(() => of(returnThisIfRetriesAreFailed))
              ))
)
.subscribe(console.log);

您還可以向延遲對象鍵添加一個方法並進行一些其他檢查。 我只是粘貼我的一段代碼,這樣你就明白了。

// 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 })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM