Rx java 使用RxJava2从一系列异步HTTP请求创建一个具有背压的可流动文件

Rx java 使用RxJava2从一系列异步HTTP请求创建一个具有背压的可流动文件,rx-java,rx-java2,Rx Java,Rx Java2,我想创建一个Flowable,以流式传输从一个异步REST API端点接收的结果,该端点按块发送结果(需要发送另一个请求,以使用前一个响应的头获取剩余的结果列表)。它不想使用背压策略,而是只在必要时(在可流动数据库中请求时)等待发送后续HTTP请求 函数Flowable.generate非常接近我想要的功能,但它似乎只适用于同步调用。对于异步调用是否有类似的解决方案,或者您对此有什么建议 谢谢我不确定我是否正确理解了您的意思,但我想您希望执行一个又一个请求,并且您需要上一个请求中的一些数据来执行

我想创建一个
Flowable
,以流式传输从一个异步REST API端点接收的结果,该端点按块发送结果(需要发送另一个请求,以使用前一个响应的头获取剩余的结果列表)。它不想使用背压策略,而是只在必要时(在可流动数据库中请求时)等待发送后续HTTP请求

函数
Flowable.generate
非常接近我想要的功能,但它似乎只适用于同步调用。对于异步调用是否有类似的解决方案,或者您对此有什么建议


谢谢

我不确定我是否正确理解了您的意思,但我想您希望执行一个又一个请求,并且您需要上一个请求中的一些数据来执行下一个请求

比如说,我们有以下
可流动的
对象:

Flowable<String> first = Flowable.fromCallable(() -> {
  Thread.sleep(2000);
  return "I need to be executed first";
});

Flowable<String> second = Flowable.fromCallable(() -> "I need to be executed later");
根据RxJava文档,concat操作符从两个或多个观测值发出发射,而不交错它们,因此请求将以正确的顺序执行

您可能还希望根据第一个请求的条件执行第二个请求,或者在第二个
可流
中使用第一个
可流
中的一些数据

使用
flatMap(…)
操作符可以实现这一点,如下所示:

Flowable.concat(first, second).subscribe(System.out::println);
first.flatMap(
    s -> s.equals("I need to be executed first")
         ? second
         : Flowable.empty())
    .subscribe(System.out::println);
在本例中,仅当第一个符合我们的要求时,才会发出第二个
可流动的
。如果不是,将发出一个空的
可流动的
。如果要在第二个
可流动
中使用第一个
中的数据,可以在
flatMap(…)
操作符中创建一个新的自定义
可流动
,而不是像这样返回
第二个
可流动

first.flatMap(
    s -> s.equals("I need to be executed first")
        ? Flowable.fromCallable(() -> "I'm using data from the first Flowable: ".concat(s))
        : Flowable.empty())
    .subscribe(System.out::println);
我希望,这个答案会对您有所帮助。

我认为它对解决问题有指导意义