Rx java 可观测支撑反拉力

Rx java 可观测支撑反拉力,rx-java,reactive-programming,rx-java2,backpressure,Rx Java,Reactive Programming,Rx Java2,Backpressure,我一直在为我认为是一个相当基本的问题而挣扎 我有一个Flowable,它从网络中检索一组项目并将其发送出去 Flowable .create(new FlowableOnSubscribe<Item>() { @Override public void subscribe(FlowableEmitter<Item> emitter) throws Exception { Item item = retriev

我一直在为我认为是一个相当基本的问题而挣扎

我有一个
Flowable
,它从网络中检索一组项目并将其发送出去

Flowable
    .create(new FlowableOnSubscribe<Item>() {
        @Override
        public void subscribe(FlowableEmitter<Item> emitter) throws Exception {
            Item item = retrieveNext();

            while (item != null) {
                emitter.onNext(item);

                if (item.isLast) {
                    break;
                }

                item = retrieveNext();
            }

            emitter.onComplete();
        }
    }, BackpressureStrategy.BUFFER)
    .doOnRequest(new LongConsumer() {
        @Override
        public void accept(long t) throws Exception {
            // ...
        }
    });
可流动
.create(新的FlowableOnSubscribe(){
@凌驾
public void subscribe(FlowableEmitter发射器)引发异常{
Item=retrieveNext();
while(项!=null){
下一个(项目);
if(item.isLast){
打破
}
item=retrieveNext();
}
emitter.onComplete();
}
},背压等级。缓冲器)
.doOnRequest(新LongConsumer(){
@凌驾
public void accept(长t)引发异常{
// ...
}
});
我需要它在每个请求的基础上工作。也就是说,我保留一个
订阅
并在必要时调用
Subscription.request(n)

关于(“反应性拉动”部分)的文章描述了
观察者的视角,并简要提到了这一点

然而,要使[反应性拉动]起作用,可观察到的A和B必须作出反应 对于请求()来说,这种支持不是必需的 可观测

它没有详细说明如何在原则上实现这种支持

是否有一个共同的模式来实现这种
可观察的
/
可流动的
?我没有找到一个好的例子或参考。我能想到的一个糟糕的选择是,在
发射器时,在
循环时,在
内锁定一个监视器。requested()==0
并从另一个线程解锁
doOnRequest()。但这种方法感觉很麻烦

那么,这种“减速”通常是如何实现的呢


谢谢。

使用
可流动。生成

Flowable.generate(
  () -> generateItemRetriever(),
  (Retriever<Item> retriever, Emitter<Item> emitter) -> {
    Item item = retriever.retrieveNext();
    if(item!=null && !item.isLast()) {
      emitter.onNext(item);
    } else {
      emitter.onComplete();
    }
  }
)
Flowable.generate(
()->generateItemRetriever(),
(寻回器寻回器,发射器发射器)->{
Item=retriever.retrieveNext();
if(item!=null&&!item.isLast()){
下一个(项目);
}否则{
emitter.onComplete();
}
}
)
生成的可流动将具有背压感知和取消订阅感知。如果您的
检索器
具有需要释放的状态,请使用3参数
生成
重载


但是,如果您正在进行HTTP调用,我建议您研究改型之类的东西,它与RxJava非常匹配。

使用
Flowable.generate

Flowable.generate(
  () -> generateItemRetriever(),
  (Retriever<Item> retriever, Emitter<Item> emitter) -> {
    Item item = retriever.retrieveNext();
    if(item!=null && !item.isLast()) {
      emitter.onNext(item);
    } else {
      emitter.onComplete();
    }
  }
)
Flowable.generate(
()->generateItemRetriever(),
(寻回器寻回器,发射器发射器)->{
Item=retriever.retrieveNext();
if(item!=null&&!item.isLast()){
下一个(项目);
}否则{
emitter.onComplete();
}
}
)
生成的可流动将具有背压感知和取消订阅感知。如果您的
检索器
具有需要释放的状态,请使用3参数
生成
重载


但是,如果您正在进行HTTP调用,我建议您研究改型之类的东西,它与RxJava非常吻合。

为了澄清,将描述为2.x编写运算符。为了澄清,将描述为2.x编写运算符。