繁体   English   中英

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

[英]rx-java2: repeat Maybe/Flowable unless empty

在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)
  }

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

对于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(...);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM