Tengo el siguiente código:
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 })El flujo general:
disconnect en socket.io-clientsignedInObservablegetNotificationsWebsocketTicket() (y creando un Observable a partir de él usando from()subscribe(value => ... ) Mi problema es que me gustaría volver a intentar el from(getNotificationsWebsocketTicket()) en caso de que falle, con un retraso de 5 segundos entre cada falla.
Solo después de 3 reintentos, quiero que falle todo el observable principal.
algo como:
from(getNotificationsWebsocketTicket()).pipe(delayedRetry(3, 5000))¿Es eso posible?
Sí, puedes hacer esto:
from(getNotificationsWebsocketTicket()).pipe( retryWhen(e$ => e$.pipe( take(3), delay(5000) )) ); retryWhen puede ser un operador un poco interesante para entenderlo. e$ es un observable administrado por el operador retryWhen . Cada vez que la fuente falla, retryWhen emite ese error a e$ .
Lo que sucede a continuación depende de lo observable que devuelva su lambda:
Errors son errores,
Completes son completos,
PERO las emisiones (a next ) son una señal para volver a intentarlo