[英]How to retry with delay an Observable inside pipe in RxJS?
我有以下代碼:
notificationsWsSubject.pipe(
filter((socket): socket is Socket => !!socket),
switchMap(socket => fromEvent<Socket.DisconnectReason>(socket, 'disconnect')),
tap(() => wsConnectedSubject.next(false)),
filter(reason => (['ping timeout', 'transport close', 'transport error'] as Socket.DisconnectReason[]).includes(reason)),
switchMap(() => signedInObservable),
switchMap(user => forkJoin([of(user), from(getNotificationsWebsocketTicket())])),
).subscribe(values => {
// Connect with websocket
}, error => {
// Throw error to user
})
一般流程:
socket.io-client
監聽disconnect
事件signedInObservable
獲取當前登錄的用戶getNotificationsWebsocketTicket()
在服務器中生成票證(並使用from()
從它創建一個Observable
subscribe(value => ... )
做一些事情我的問題是我想重試from(getNotificationsWebsocketTicket())
以防它失敗,每次失敗之間有 5 秒的延遲。
只有在 3 次重試后,我才希望整個主要 observable 失敗。
就像是:
from(getNotificationsWebsocketTicket()).pipe(delayedRetry(3, 5000))
那可能嗎?
是的,你可以這樣做:
from(getNotificationsWebsocketTicket()).pipe(
retryWhen(e$ => e$.pipe(
take(3),
delay(5000)
))
);
retryWhen
可能是一個有趣的運算符,可以讓您了解一下。 e$
是一個由retryWhen
操作符管理的retryWhen
。 任何時候源錯誤, retryWhen
將該錯誤發送到e$
。
接下來發生的事情取決於您的 lambda 返回的 observable:
Errors
就是錯誤,
Completes
就是完成,
但是排放( next
)是重試的提示
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.