2015-11-24 16 views
5

Kullanım durumum, bir Gözden geçirme işleminin başarı ve başarısızlık eylemlerini eşleştirmektir. Bir ağ çağrısı yapıyorum (söz veren bir işlevle), başarılı olursa bir hata eyleminden başarısız olursa bir başarı eylemini iletmem gerekiyor. Gözlemlenebilir kendisi devam etmelidir. RxJS'nin arama yapabildiğim her şey için, hatayı yakalamak ve orijinali yeniden denemek için bir mekanizma yoktur.RxJS catch ** ve ** Gözlemlenebilir bir yeniden deneyin

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

yani ben bir konu oluşturmak ve bu konuda içine hataları itmek ve bu hata eylemlerin gözlemlenebilir oluşturmak: Ben memnun değilim benim kod çözümü şu var.

RxJS'de bunu yapmanın daha iyi bir alternatifi var mı? Temel olarak, hangi hatanın meydana geldiğine dair bir bildirim yaymak istiyorum ve sonra Gözlemlenebilir zaten ne yapıyorsa devam edin.

cevap

9

Bu yeniden denemek istiyorum başarısız sorgular:

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: Tekrar denemek istemiyorsanız

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

, ama sadece bildirmek veya hataları görmezden istiyorum! Iç içe gözlemlenebilir. Neden bunu düşünmedim? Tahmin Edilebilir dünyaya alışmak için daha fazla zaman alacağını tahmin et. Teşekkürler. – channikhabra