我想使用Subject来创建一个Observable到下一个Observable之间的管道,而不使用map或flatMap,因为使用它们是如此冗长。
我无法弄清楚如何使用Subject进行此操作,尽管这似乎是一个主题(根据文档)的正确方法:
既可以作为订阅者也可以作为Observable
签名为Subject<T,R>
,其中Observable<R>
和Observer<T>
。这意味着我应该能够将T
传递给R
。
以下是代码中的基本外观:
class MySubject extends Subject<T, R> {
protected MySubject(OnSubscribe<R> onSubscribe) {
super(onSubscribe);
}
@Override public void onNext(T in) {
// Data comes in
}
@Override public void onCompleted() {
// do something
}
@Override public void onError(Throwable throwable) {
// do something with the error
}
}
答案 0 :(得分:0)
我在Monifu中通过以flatMap方式提供观察者来处理这个问题(忽略PublishSubject是最终类的事实)。它应该类似于RxJava或RxScala:
class PipeSubject extends PublishSubject[RxEvent] {
override def onNext(elem: RxEvent): Future[Ack] = {
if (!isCompleted) {
val observers = subscriptions
if (observers.nonEmpty)
pipeThroughMany(observers, elem)
else
Continue
}
else
Cancel
}
private[this] def pipeThroughMany(array: Array[Observer[T]], elem: T): Future[Continue] = {
val length = array.length
def >>>(idx: Int = 0): Future[Continue] = {
val obs = array(idx)
obs.onNext(elem).flatMap {
case Continue =>
if (idx+1 < length)
>>>(idx+1)
else
Continue
case _ =>
removeSubscription(obs)
Continue
}
}
>>>()
}
}