2015-11-24 34 views
5

Trường hợp sử dụng của tôi là lập bản đồ một hành động quan sát được đối với các hành động chuyển đổi thành công và thất bại. Tôi thực hiện cuộc gọi mạng (với chức năng hứa hẹn), nếu thành công, tôi phải chuyển tiếp một hành động thành công, nếu nó không thành công hơn là một hành động lỗi. Bản thân Quan sát sẽ tiếp tục. Đối với tất cả tôi có thể tìm kiếm, RxJS không có một cơ chế cho việc này bắt lỗi và thử lại bản gốc.Bắt RxJS ** và ** thử lại một Quan sát

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

tức là tôi có thể tạo một chủ đề, và đẩy lỗi vào đối tượng đó và tạo ra một Quan sát các hành động lỗi từ rằng: Tôi đã giải pháp trong mã của tôi mà tôi không hài lòng với sau.

Có cách nào tốt hơn để thực hiện việc này trong RxJS mà tôi bị thiếu không? Về cơ bản tôi muốn phát ra một thông báo về những gì lỗi đã xảy ra, và sau đó tiếp tục với bất cứ điều gì quan sát đã làm.

Trả lời

9

này sẽ thử lại truy vấn thất bại:

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

Nếu bạn không muốn thử lại, nhưng chỉ muốn thông báo hoặc bỏ qua lỗi:

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! Các lồng nhau quan sát được. Tại sao tôi không nghĩ về nó! Đoán nó sẽ mất nhiều thời gian hơn để làm quen với thế giới quan sát được. Cảm ơn. – channikhabra

Các vấn đề liên quan