我需要创建一个带有背压的自定义Flowable。我正在尝试实现某种分页。这意味着当下游请求5个项目时,我将“向数据源”询问项目0-5。然后,当下游需要另外5个项目时,我将获得项目5 - 10并发回。
到目前为止我发现的最好的事情是使用Flowable.generate
方法,但我真的不明白为什么没有办法(据我所知)如何得到requested
数字下游要求的项目。我可以使用生成器的state
属性来保存请求的最后项目的索引,这样我只需要新请求的项目数。我在BiFunction apply
中获得的emmiter实例是GeneratorSubscription
,它从AtomicLong
延伸。因此,向AtomicLong
投射发射器可以获得所需的数字。但我知道这不是“推荐”的方式。
另一方面,当您使用Flowable.create
时,您将获得具有long requested()
方法的FlowableEmitter。使用generate
更适合我的用例,但现在我也很好奇使用Flowable.generate
的“正确”方法。
也许我在思考整件事情,所以请指出我正确的方向。 :)谢谢。
这就是实际代码的样子(在Kotlin中):
Flowable.generate(Callable { 0 }, BiFunction { start /*state*/, emitter ->
val requested = (emitter as AtomicLong).get().toInt() //this is bull*hit
val end = start + requested
//get items [start to end] -> items
emmiter.onNext(items)
end /*return the new state*/
})
答案 0 :(得分:0)
好的,我发现BiFunction的apply
函数被多次调用,就像请求数量(n)一样。所以没有理由为它吸气。这不是我所希望的,但显然generate
是如何运作的。 :)