почему оператор RxJS retryWhen завершает свой внутренний Observable? - PullRequest
1 голос
/ 17 марта 2019

Почему retryWhen завершается с его внутренней наблюдаемой?

Представьте, что нам нужно сделать максимум 3 попыток получения данных. И, например, ради * наша 3-я попытка определенно сработает . Поэтому я пробую следующее:

// ...
retryWhen(errors$ =>
  errors$.pipe(
    take(3)
  )
)

Который сделает 3 попытки, но сразу же завершит после 3-й ошибки вместе со своей внутренней наблюдаемой. Даже если наша третья попытка принесла нам результаты.

Иллюстрация:

retryWhen completing with inner Observable

Запустить этот пример

ОБНОВЛЕНИЕ ПРИМЕЧАНИЕ: Возможно, для правильного ограничения попыток повторных попыток - нам следует использовать switchMap для переключения на основе индекса на of(error) или throwError(error).

Для меня это поведение было неожиданным: как будто внутренняя наблюдаемая будет вызывать только повторную попытку. И как только он уведомляет о повторной попытке - его работа выполнена, и нам все равно, завершится ли он.

Так что этот вопрос скорее теоретический, чем практический:

Что послужило причиной этого конкретного поведения? И в чем его преимущества?

ПРИМЕЧАНИЕ: Это не проблема, оператор ведет себя, как описано

Возвращает наблюдаемое, которое отражает источник, наблюдаемый с помощью исключение ошибки. Если источник Observable вызывает ошибку, это метод испускает Throwable, который вызвал ошибку в Observable вернулся из уведомителя. Если вызовы Observable завершены или произошла ошибка тогда этот метод вызовет завершение или ошибку на дочернем подписка. В противном случае этот метод будет повторно подписаться на источник Наблюдаемое.

...