我为RxJava搜索等效的RxJS.pausable(Observable)。
目前我有以下内容,但看起来有点奇怪。还有更好的方法吗?
PublishSubject<Boolean> allValidSubject = PublishSubject.create();
PublishSubject<Void> clickSubject = PublishSubject.create();
allValidSubject
.switchMap(valid -> valid ? clickSubject : Observable.empty())
.skipUntil(allValidSubject)
// ...
最后我有两个可观察者。一个用于输入验证,一个用于发送按钮单击事件。
答案 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。同样的fasle / true可以被推到暂停上,这是distrinctUntilChanged开始的地方,以避免恢复或暂停,如果已经恢复/暂停。