2015-11-24 21 views
5

Il mio caso d'uso è mappare un'azione Observable to redux di successo e fallimento. Faccio una chiamata di rete (con una funzione che promette), se riesce, devo inoltrare un'azione di successo, se fallisce di un'azione di errore. L'Osservabile stesso andrà avanti. Per quanto ho potuto cercare, RxJS non ha un meccanismo per catturare l'errore e riprovare l'originale. Ho seguente soluzione nel mio codice, che non sono felice con:RxJS catch ** e ** riprova un Observable

error$ = new Rx.Subject(); 

searchResultAction$ = search$ 
    .flatMap(getSearchResultsPromise) 
    .map((resuls) => { 
     return { 
      type: 'SUCCESS_ACTION', 
      payload: { 
       results 
      } 
     } 
    }) 
    .retryWhen((err$) => { 
     return err$ 
      .pluck('query') 
      .do(error$.onNext.bind(error$)); 
    }); 

searchErrorAction$ 
    .map((query) => { 
     return { 
      type: 'ERROR_ACTION', 
      payload: { 
       query, 
       message: 'Error while retrieving data' 
      } 
     } 
    }); 

action$ = Observable 
    .merge(
     searchResultAction$, 
     searchErrorAction$ 
    ) 
    .doOnError(err => console.error('Ignored error: ', err)) 
    .retry(); 

action$.subscribe(dispatch); 

cioè creo un soggetto, e spingere gli errori in quel soggetto e creare un 'osservabile di azioni di errore da questo.

Esiste un'alternativa migliore a RxJS che mi manca? Fondamentalmente voglio emettere una notifica di quale errore si è verificato, e quindi continuare con ciò che l'Observable sta già facendo.

risposta

9

Ciò riprovare query non riuscita:

var action$ = search$ 
    .flatMap(value => { 
     // create an observable that will execute 
     // the query each time it is subscribed 
     const query = Rx.Observable.defer(() => getSearchResultsPromise(value)); 

     // add a retry operation to this query 
     return query.retryWhen(errors$ => errors$.do(err => { 
      console.log("ignoring error: ", err); 
     })); 
    }) 
    .map(payload => ({ type: "SUCCESS_ACTION", payload })); 

action$.subscribe(dispatcher); 

Se non si desidera riprovare, ma solo voglia di comunicare o di ignorare gli errori:

var action$ = search$ 
    .flatMap(value => { 
     // create an observable that will execute 
     // the query each time it is subscribed 
     const query = Rx.Observable.defer(() => getSearchResultsPromise(value)); 

     // add a catch clause to "ignore" the error 
     return query.catch(err => { 
      console.log("ignoring error: ", err); 
      return Observable.empty(); // no result for this query 
     })); 
    }) 
    .map(payload => ({ type: "SUCCESS_ACTION", payload })); 

action$.subscribe(dispatcher); 
+0

Ah! L'osservabile nidificato. Perché non ci ho pensato! Immagino che ci vorrà più tempo per abituarsi al mondo Osservabile. Grazie. – channikhabra

Problemi correlati