Повторите предыдущую наблюдаемую - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть функция, которая возвращает обещание. Я хочу поймать ошибку на этом, а затем экспоненциально подождать и повторить попытку. Но сейчас я просто жду константу 5 с. Вот мой код:

from(connectSocket()).pipe(
    catchError(e => {
        console.log('got error!', e.message);
        return timer(5000).pipe(
            tap(() => console.log('will repeat connect now')),
            repeat(1)
        );
    }),
    tap(() => setIsConnected.next(true))
);

Однако это не повторяется.

Мой полный код находится в этой песочнице - https://stackblitz.com/edit/rxjs-g7msgv?file=index.ts

1 Ответ

1 голос
/ 28 апреля 2019

Чтобы сделать экспоненциальную повторную попытку, вам нужно использовать retryWhen.Вот пример:

// will retry with
// 0, 10, 40, 90, 160 ms delays
retryWhen(error$ =>
  error$.pipe(
    delayWhen((_, i) => timer(i * i * 10))
  )
)

exponential backoff

Попробуйте этот код на детской площадке

В вашем примере вы повторяете timer вместо повтор from(connectSocket()).Поэтому замените catchError на retryWhen, чтобы получить то, что вам нужно.

Надеюсь, это поможет

-

Кроме того, существуют сторонние инструменты для добавления экспоненциального отката.Например,
https://github.com/alex-okrushko/backoff-rxjs

См. мою статью "Обработка ошибок в RxJS" , чтобы лучше понять ошибки и повторы в RxJS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...