Добавление к решению Мартина:
Приведенный выше код только делает первый запрос и в случае ошибки выдает исключение (не повторяет запрос).
retryWhen(fn)
поддерживает внутреннюю подписку на наблюдаемое в результате вызова предоставленной функции fn
. Источник retryWhen
будет повторно подписан только тогда, когда внутренняя наблюдаемая испускает значение .
В вашем случае, из-за секунды throwError()
, он выдаст уведомление об ошибке, так что retryWhen
делает в этом случае, чтобы передать уведомление об ошибке целевому подписчику, что в основном означает, что будет вызван обратный вызов ошибки, и весь поток будет отменен Успешно.
Это потому, что когда будет выполнено 4 попытки, внутренняя наблюдаемая будет завершена, что означает, что не будет способа снова выдать значение. Помните, что когда он выдает значение, источник повторно подписывается .