possiamo usare la cache dell'operatore() per evitare l'esecuzione di un lungo lavoro (richiesta HTTP) più volte, e riutilizzare il suo risultato:osservabile, riprovare in caso di errore e la cache solo se conseguiti
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);
La prima volta, la richiesta http viene eseguita, ma la seconda volta, poiché abbiamo utilizzato l'operatore cache(), la richiesta non verrà eseguita, ma riusciamo a riutilizzare il primo risultato.
Questo funziona correttamente quando la prima richiesta viene completata correttamente. Ma se onError viene chiamato al primo tentativo, la prossima volta che un nuovo utente si iscrive allo stesso osservabile, l'onError verrà richiamato senza tentare nuovamente la richiesta http.
Quello che stiamo cercando di fare è che se onError viene chiamato la prima volta, la prossima volta che qualcuno si iscrive allo stesso osservabile, la richiesta http verrà tentata da zero. cioè l'osservabile memorizzerà solo le chiamate api riuscite, cioè quelle per le quali è stato chiamato onCompleted.
Qualche idea su come procedere? Abbiamo provato a utilizzare gli operatori retry() e cache() senza troppa fortuna.
Grazie akarnokd, questo sembra buono. Ho solo alcuni problemi quando l'origine è una richiesta HTTP di lunga durata (alcuni secondi), e la seconda, i terzi iscritti si iscrivono mentre i primi sono ancora in corso. In tal caso falliscono tutti e la richiesta non viene tentata più di una volta. L'operatore cache() si comporta diversamente. Vedrò di più e tenterò di replicare il problema che sto menzionando usando il tuo esempio, e ti ricontatteremo presto. – Plato