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

时间:2017-08-25 08:52:26

标签: rx-java rx-java2

我想创建一个Flowable来传输从异步REST API端点收到的结果,该端点每个块发送结果(有必要使用前一个标头发送另一个请求来获取剩余的结果列表响应)。它不想使用背压策略,而是等待仅在必要时(在Flowable中请求时)发送后续HTTP请求。

函数Flowable.generate非常接近我想要的但它似乎只适用于同步调用。有一个像这样的解决方案用于异步调用,或者你有任何建议吗?

由于

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解正确,但我想您想要一个接一个地执行一个请求,并且您需要先前请求中的一些数据来执行下一个请求。

假设我们有以下Flowable个对象:

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");

首先Flowable会慢一些,但我们希望在second之后执行first

我们可以使用concat(...)运算符执行此操作,如下所示:

Flowable.concat(first, second).subscribe(System.out::println);

根据RxJava文档,concat运算符从两个或多个Observable发出发射而不进行交错,因此请求将以正确的顺序执行。

您可能还希望执行第二个请求,具体取决于第一个请求中的条件,或者使用第二个Flowable中第一个Flowable中的一些数据。

您可以使用flatMap(...)运算符实现此目的,如下所示:

first.flatMap(
    s -> s.equals("I need to be executed first")
         ? second
         : Flowable.empty())
    .subscribe(System.out::println);

在此示例中,第二个Flowable将仅在第一个Flowable完全按照我们想要的时间发出。如果不是,则会发出空Flowable。如果您想使用第二个Flowable中的第一个flatMap(...)数据,您可以在second运算符中创建新的自定义Flowable,而不是仅返回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); {{ 1}}那样:

atEnter={{ translateX: 100 }}
atLeave={{ translateX: -100 }}
atActive={{ translateX: 0 }}

我希望,这个答案可以帮到你。