мы можем использовать оператор cache(), чтобы избежать выполнения длинной задачи (http-запроса) несколько раз и повторно использовать ее результат:
Observable apiCall = createApiCallObservable().cache(); // notice the .cache()
---------------------------------------------
// the first time we need it
apiCall.andSomeOtherStuff()
.subscribe(subscriberA);
---------------------------------------------
//in the future when we need it again
apiCall.andSomeDifferentStuff()
.subscribe(subscriberB);
В первый раз выполняется HTTP-запрос, но во второй раз, поскольку мы использовали оператор cache(), запрос не будет выполнен, но мы сможем повторно использовать первый результат.
Это отлично работает, когда первый запрос завершается успешно. Но если onError вызывается с первой попытки, то в следующий раз, когда новый подписчик подписывается на одно и то же наблюдаемое, onError будет вызван снова, не повторив запрос http.
То, что мы пытаемся сделать, состоит в том, что если onError вызывается в первый раз, то в следующий раз, когда кто-то присоединяется к тому же наблюдаемому, http-запрос будет предпринят с нуля. т.е. наблюдаемый будет кэшировать только успешные вызовы api, то есть те, для которых был вызван onCompleted.
Любые идеи о том, как действовать? Мы пробовали использовать операторы retry() и cache() без особого успеха.