如何创建一次从BehaviorSubject发出一次然后onComplete的Observable?

时间:2014-09-26 00:53:50

标签: java rx-java

我需要从Observable<T>创建BehaviorSubject<Observable<T>>。创建的observable应该只发出一次项目,然后调用onComplete()

有办法做到这一点吗?

谢谢!

修改

private BehaviorSubject<Observable<T>> subject = BehaviorSubject.create();

public Observable<T> getObservable(){
   //return the subject as Observable<T> which emits once and call onComplete()
}

2 个答案:

答案 0 :(得分:1)

因此,您有一个发布Observable<T>的BehaviorSubject,并且您希望创建一个Observable<T>,只发出第一个主题发出的可观察对象。你可以这样做:

public Observable<T> getObservableWithJustOneElement(){
    return subject.flatMap(new Func1<Observable<T>, Observable<T>>(){

        @Override
        public Observable<T> call(Observable<T> source) {
           return source;
        }
    })
    .take(1);
}

我知道它看起来有点奇怪,但它应该做你想要的。首先,flatMap Observable<Observable<T>>展平Observable<T>(它只是在转换意义上没有做任何映射要素)。然后,take(1)确保只有一个项目会onNext()发出,之后会调用onCompleted()

如果你只想要主题发出的第一个Observable发出的项目,你可以改为使用它:

public Observable<T> getObservableWithJustOneElement(){
    return subject.take(1)
    .flatMap(new Func1<Observable<T>, Observable<T>>(){

        @Override
        public Observable<T> call(Observable<T> source) {
           return source;
        }
    });
}

答案 1 :(得分:0)

您还可以创建一个Observable,例如从ReplaySubject或带有the first operatorBehaviourSubject发出一次。

return behaviorSubject.pipe(first());

如果要返回满足某些条件的第一项,可以使用谓词作为参数:

const predicate = (result: any): boolean => { 
  //your test to check the result should return true...
}
return behaviorSubject.pipe(first(predicate));