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);
我希望,这个答案会对您有所帮助。我认为它对解决问题有指导意义