我想创建一个Flowable
来传输从异步REST API端点收到的结果,该端点每个块发送结果(有必要使用前一个标头发送另一个请求来获取剩余的结果列表响应)。它不想使用背压策略,而是等待仅在必要时(在Flowable中请求时)发送后续HTTP请求。
函数Flowable.generate
非常接近我想要的但它似乎只适用于同步调用。有一个像这样的解决方案用于异步调用,或者你有任何建议吗?
由于
答案 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 }}
我希望,这个答案可以帮到你。