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)
我尝试添加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)
您还可以向延迟对象键添加一个方法并执行一些其他检查。我只是粘贴一段代码,以便您明白要点。
// 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)
| 归档时间: |
|
| 查看次数: |
10008 次 |
| 最近记录: |