我需要从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()
}
答案 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 operator的BehaviourSubject
发出一次。
return behaviorSubject.pipe(first());
如果要返回满足某些条件的第一项,可以使用谓词作为参数:
const predicate = (result: any): boolean => {
//your test to check the result should return true...
}
return behaviorSubject.pipe(first(predicate));