RxJava运算符,它结合了两个observable并仅在第一个observable发出时发出

时间:2016-10-02 13:45:53

标签: android rx-java

我是RxJava的新手,我很难找到合适的操作员。 我想要combineLatest之类的东西,但只在第一个Observable发出项目时从第二个Observable中取出最后一个项目时发出事件。 我目前正在使用BehaviourSubject这样做,但如果有运营商做这样的事情,我想避免使用外部变量。

我现在拥有的:

        BehaviorSubject<Login> inputSubject = BehaviorSubject.create();
    Observable.
            combineLatest(
                    RxTextView.textChanges(inputEmail.getEditText()),
                    RxTextView.textChanges(inputPassword.getEditText()),
                    Login::new)
            .subscribe(inputSubject);
    return RxView.clicks(loginBtn).map(v -> inputSubject.getValue());

2 个答案:

答案 0 :(得分:0)

您应该使用第二个observable上的最后一个运算符并使用zip来组合它们。

答案 1 :(得分:0)

您可以使用第二个combineLatest

Observable<Void> clicks = RxView.clicks(loginBtn);
Observable<Login> loginData = ...

class TaggedLogin {
    Object tag;
    Login data;

    TaggedLogin(Object tag, Login data) {
        this.tag = tag;
        this.data = data;
    }
}

return Observable.combineLatest(
    clicks.map(v -> new Object()), 
    loginData, 
    TaggedLogin::new
).distinctUntilChanged(tl -> tl.tag).map(tl -> tl.data);

需要使用标签进行操作,因为如果其中任何一个具有新值,combineLatest将会发出。

如果您愿意使用Experimental功能(也称RxJava将来可能删除或更改它们),则可能出现以下情况:

Observable<Void> clicks = RxView.clicks(loginBtn);
Observable<Login> loginData = ...

return clicks.withLatestFrom(loginData, (v, data) -> data);