如何创建可观察到的东西,它先发射一次,然后从BehaviorSubject发出onComplete?

问题描述 投票:1回答:2

我需要从Observable<T>创建一个BehaviorSubject<Observable<T>>。创建的可观察对象应该只发射一次,然后调用onComplete()

有没有办法做到这一点?

谢谢!

编辑

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

public Observable<T> getObservable(){
   //return the subject as Observable<T> which emits once and call onComplete()
}
java rx-java
2个回答
1
投票

因此,您有一个BehaviorSubject发出Observable<T>,然后您要创建一个Observable<T>,它只发出Subject发出的first Observable的first项。您可以这样做:

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 flattens Observable<Observable<T>>简化为Observable<T>(就转换元素而言,它不执行任何mapping)。然后,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;
        }
    });
}

0
投票

[您还可以创建一个从Observable或带有ReplaySubjectBehaviourSubject发出一次的the first operator

return behaviorSubject.pipe(first());

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

const predicate = (result: any): boolean => { 
  //your test to check the result should return true...
}
return behaviorSubject.pipe(first(predicate));
© www.soinside.com 2019 - 2024. All rights reserved.