我需要从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()
}
因此,您有一个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;
}
});
}
[您还可以创建一个从Observable
或带有ReplaySubject
的BehaviourSubject
发出一次的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));