2015-11-24 33 views
5

我的用例是將一個Observable映射到redux動作的成功和失敗。我做了一個網絡調用(帶有一個承諾的函數),如果成功,我必須轉發一個成功的動作,如果失敗而不是錯誤動作。 Observable本身應該繼續前進。對於我所能搜索到的所有內容,RxJS沒有這種捕獲錯誤並重試原始文件的機制。我有以下我的代碼的解決方案,我不是很滿意:RxJS catch **和**重試一次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

啊!嵌套的observable。爲什麼我沒有想到它!猜猜它需要更多時間才能適應Observable世界。謝謝。 – channikhabra

相關問題