[英]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);
我嘗試添加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.