2016-02-16 101 views
1

我搜索RxJava的等效RxJS.pausable(Observable)相當於RxJava的RxJS.pausable(Observable)

目前我有以下,但它看起來有點奇怪。有沒有更好的辦法?

PublishSubject<Boolean> allValidSubject = PublishSubject.create(); 
PublishSubject<Void> clickSubject = PublishSubject.create(); 

allValidSubject 
     .switchMap(valid -> valid ? clickSubject : Observable.empty()) 
     .skipUntil(allValidSubject) 
// ... 

最後我有兩個觀察對象。一個用於輸入驗證,另一個用於發送按鈕單擊事件。

+0

您是否試圖驗證某些表單輸入,並在按鈕被點擊後繼續,如果輸入正確?如果你是,那麼'combineLatest'通常是答案... – AndroidEx

+0

那麼這不是很酷,至少接近答案。 –

回答

2

我認爲這樣做會做到這一點。

Observable<String> event = Observable.just("My Input"); 
// false - paused by default 
final BehaviorSubject<Boolean> pauser = BehaviorSubject.create(false); 

event 
    .flatMap(new Func1<String, Observable<String>>() { 
     @Override 
     public Observable<String> call(final String input) { 
      return pauser 
        .distinctUntilChanged() 
        .filter(new Func1<Boolean, Boolean>() { 
         @Override 
         public Boolean call(Boolean resumed) { 
          return resumed; 
         } 
        }) 
        .map(new Func1<Boolean, String>() { 
         @Override 
         public String call(Boolean resumed) { 
          return input; 
         } 
        }); 
     } 
    }) 
    .subscribe(new Action1<String>() { 
     @Override 
     public void call(String input) { 
      // handle input 
     } 
    }); 

要恢復/ PASE:

pauser.onNext(true); 
pauser.onNext(false); 

觀察到的事件可以用combineLatest替代上述建議如何,但每次使用的情況下,仍然可以flatMapped。如果已經恢復/暫停,則可以將相同的正確/真實推送到暫停,這是distrinctUntilChanged開始執行以避免恢復或暫停的地方。