2015-11-24 11 views
5

私は、Observableを成功と失敗のアクションを減らすためにマッピングすることを想定しています。私はネットワークコールを(約束を与える関数で)行います。成功した場合、エラーアクションより失敗した場合、成功アクションを転送する必要があります。観察可能なもの自体は続かなければならない。私が検索できるすべてのものについて、RxJSにはこのエラーをキャッチして元のものを再試行する仕組みがありません。私は、件名を作成し、その対象に誤りを押すと、そのエラーからのアクションの観測を作成RxJS catch ** and 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); 

すなわち:私は、私はと満足していない私のコード内の溶液を次しています。

私はRxJSでこれを行うより良い方法がありますか?基本的には、どのようなエラーが発生したのかを通知し、Observableが何をしているのかを続けたいと思います。

答えて

9

これは失敗したクエリを再試行します:

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

は、再試行するが、ちょうど、エラーを通知したり、無視したくない場合は、次の

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

ああ!ネストされたオブザーバブルなぜ私はそれを考えなかったのですか?観察可能な世界に慣れるにはもっと時間がかかるでしょう。ありがとう。 – channikhabra

関連する問題