RxJava作为管道主题

时间:2014-03-22 02:12:32

标签: mapping pipe rx-java

我想使用Subject来创建一个Observable到下一个Observable之间的管道,而不使用mapflatMap,因为使用它们是如此冗长。

我无法弄清楚如何使用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
  }

}

1 个答案:

答案 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
      }
    }
    >>>()
  }
}