2016-06-22 5 views
6

Non è chiaro come propagare gli errori ai sottoscrittori in REactiveX in modo che l'Observable non venga distrutto.ReactiveX: gestione degli errori che non distrugge osservabile

Esempio

observable.onNext(1); 
observable.onNext(2); 
observable.onError("Nope"); 
observable.onNext(3);<<won't work. 

accetto questa restrizione come è, però ho ancora scenario in cui voglio ascoltatori a valle sappiano riscontrato un errore E Non voglio il osservabile a morire.

Il caso d'uso principale per questo è il codice UI che, se arriva un errore, non voglio dover chiamare "Setup" contro tutti gli osservabili in precedenza registrati.

Le possibili alternative sono

a) spingere un oggetto personalizzato che ha un campo di dati e un campo di errore

class Data 
{ 
    int value; 
    Error * error; 
} 

Non mi piace questa soluzione

b) avere due flussi. Uno per i dati e uno per gli errori.

observable.onNext(1); 
observable.onNext(2); 
errorObservable.onNext("Error"); 
observable.onNext(3); 

Quali sono le migliori pratiche comuni per questo?

risposta

1

Vorrei assolutamente andare con l'opzione A): creare un oggetto che può contenere sia dati che errori. Non importa come si avvolgeranno i dati e possibili errori in quell'oggetto, ma l'invio di entrambi attraverso un flusso come eventi onNext() è la soluzione giusta che offre agli abbonati tutte le informazioni e tutta la libertà di gestirli.

L'opzione B) potrebbe essere piuttosto impegnativa da implementare in scenari asincroni più complessi e probabilmente porterebbe all'utilizzo di un sacco di Subject s che è anche negativo.

0

Se si aggiunge nuovamente retry() alla sorgente osservabile, il sottoscrittore non ha bisogno di iscriversi nuovamente.