rx-java2:重复Maybe / Flowable,除非为空

时间:2019-05-29 20:53:52

标签: java kotlin rx-java2

在rx-java2中,存在Maybe.repeat()/ Flowable.repeat()运算符。但是,如果Maybe / Flowable为空,则它将无限期地重新订阅它,并且不发出值或完成状态。 仅当先前的订阅确实发出了某些内容时,我才能重新订阅吗?

在projectreactor中可以使用repeatWhen()运算符:

someMono.repeatWhen { it.takeWhile { i -> i > 0 } }

但是在rx-java2中,此运算符不能以这种方式工作。因此,如果Maybe为空,当前会发出一个错误,然后从该错误中恢复:

someMaybe
  .switchIfEmpty(Maybe.error(MyStopException()))
  .repeat()
  .onErrorResumeNext { th: Throwable ->
    if (th is MyStopException)
      Flowable.empty()
    else
      Flowable.error(th)
  }

有没有更好/更自然的方法?

1 个答案:

答案 0 :(得分:0)

对于Maybe情况,您可以执行以下操作:

someMaybe
    .flatMapPublisher(value ->
        Flowable.just(value).repeat()
    )
    .subscribe(...);

这样,如果someMaybe为空,则不会调用Flowable.just(value).repeat()

对于Flowable案例,您可以执行以下操作:

    AtomicBoolean empty = new AtomicBoolean(true);
    someFlowable
        .doOnNext(value -> empty.set(false))
        .repeatWhen(completed ->
          completed.takeUntil(__ -> { return empty.get(); })
        )
        .subscribe(...);

可能有更好的方法,但是我想不出其他任何不涉及实现自定义运算符的方法。