簡體   English   中英

如何在 RxJS 中延遲管道內的 Observable 重試?

[英]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.

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