możemy korzystać z pamięci podręcznej (operator), aby uniknąć wykonywania długiego zadania (żądania HTTP) wiele razy, i ponowne jej wynik:Obserwowalne, ponownie w przypadku błędu i pamięci podręcznej tylko wtedy, gdy zakończone
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);
po raz pierwszy, Żądanie http jest wykonywane, ale po raz drugi, ponieważ użyliśmy operatora cache() , to żądanie nie zostanie wykonane, ale będziemy mogli ponownie użyć pierwszego wyniku.
Działa to poprawnie, gdy pierwsze żądanie zakończy się pomyślnie. Ale jeśli onError zostanie wywołany przy pierwszej próbie, to następnym razem, gdy nowy subskrybent zarejestruje się w ten sam sposób, onError zostanie wywołany ponownie bez próby ponownego wysłania żądania http.
Staramy się, aby jeśli onError został wywołany po raz pierwszy, to następnym razem, gdy ktoś subskrybuje to samo, co obserwowalne, żądanie http zostanie wykonane od podstaw. Oznacza to, że obserwowalne będą buforować wyłącznie skuteczne wywołania api, tj. te, dla których wywołano funkcję onCompleted.
Wszelkie pomysły na temat postępowania? Próbowaliśmy używać operatorów retry() i cache() bez większego szczęścia.
Dzięki akarnokd, to wygląda dobrze. Mam tylko pewne problemy, gdy źródłem jest długo działające żądanie http (kilka sekund), a drugie, trzecie subskrybowanie subskrybuje, podczas gdy pierwsze są w toku. W takim przypadku wszystkie zawodzą, a próba nie jest podejmowana więcej niż jeden raz. Operator cache() zachowuje się inaczej. Przyjrzę się temu bardziej i spróbuję powtórzyć problem, o którym wspomniałem, korzystając z przykładu, a wkrótce skontaktuję się z Tobą. – Plato