2015-11-24 9 views
5

Mein Anwendungsfall ist die Zuordnung eines Observable zu reduktiven Aktionen von Erfolg und Misserfolg. Ich mache einen Netzwerkanruf (mit einer Funktion, die verspricht), wenn es erfolgreich ist, muss ich eine Erfolgsaktion weiterleiten, wenn es fehlschlägt als eine Fehleraktion. Das Observable selbst soll weitermachen. Für alle, die ich suchen konnte, haben RxJS keinen Mechanismus, um den Fehler zu finden und das Original erneut zu versuchen. Ich habe folgende Lösung in meinem Code, die ich nicht mit glücklich bin:RxJS fangen ** und ** wiederholen ein 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); 

d.h erstelle ich ein Thema, und drücken Sie Fehler in diesem Thema und erstellen eine beobachtbare von Fehleraktionen aus, dass.

Gibt es eine bessere Alternative in RxJS, die ich vermisse? Grundsätzlich möchte ich eine Benachrichtigung über den aufgetretenen Fehler ausgeben und dann mit dem fortfahren, was das Observable bereits tut.

Antwort

9

Dies würde versuchen failed Anfragen:

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); 

Wenn Sie nicht erneut zu versuchen wollen, wollen aber nur Fehler benachrichtigen oder ignorieren:

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! Das verschachtelte Observable. Warum habe ich nicht daran gedacht! Ich denke, es wird mehr Zeit brauchen, um sich an die Welt der Observablen zu gewöhnen. Vielen Dank. – channikhabra

Verwandte Themen