在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)
}
有没有更好/更自然的方法?
答案 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(...);
可能有更好的方法,但是我想不出其他任何不涉及实现自定义运算符的方法。