Retrofits 请求的顺序,其中下一个请求取决于上一个请求的结果
Sequence of Retrofits' request where next request depends on result of previous request
我有一系列改造请求:
Observable.interval(0, Integer.MAX_VALUE - 1).concatMap(index -> index == 0 ? getRequestA() : getRequestB()).takeUntil(<condition>)
请求 B 具有必须从请求 A 的结果中获取的参数等
A -> B(p from A.result) -> B1(p from B.result) -> Bn(p from B[n-1].result)
我该怎么做?
可以使用flatMap
,比如
getRequestA().flatMap(a -> getRequestB(a))
.flatMap(b -> getRequestB1(b))
.flatMap(b1 -> getRequestB2(b1))
...
因为每个 事件 都会使用之前事件中的一些东西,scan 可能是您正在寻找的运算符。
累加器将是组合的可观察值 "up to the current event"。
这是一个示例实现:
// Dummy/sample getRequestB
Func1<Integer, Observable<Integer>> getRequestB = i -> Observable.<Integer>create(sub -> { sub.onNext(2*i+1);sub.onCompleted();});
Observable.range(0, Integer.MAX_VALUE -1)
.scan(Observable.just(0), (acc, rangeIdx) -> acc.concatMap(getRequestB::call))
.concatMap(o -> o)
.takeUntil(i -> i > 100000)
.subscribe(System.err::println);
我有一系列改造请求:
Observable.interval(0, Integer.MAX_VALUE - 1).concatMap(index -> index == 0 ? getRequestA() : getRequestB()).takeUntil(<condition>)
请求 B 具有必须从请求 A 的结果中获取的参数等
A -> B(p from A.result) -> B1(p from B.result) -> Bn(p from B[n-1].result)
我该怎么做?
可以使用flatMap
,比如
getRequestA().flatMap(a -> getRequestB(a))
.flatMap(b -> getRequestB1(b))
.flatMap(b1 -> getRequestB2(b1))
...
因为每个 事件 都会使用之前事件中的一些东西,scan 可能是您正在寻找的运算符。
累加器将是组合的可观察值 "up to the current event"。
这是一个示例实现:
// Dummy/sample getRequestB
Func1<Integer, Observable<Integer>> getRequestB = i -> Observable.<Integer>create(sub -> { sub.onNext(2*i+1);sub.onCompleted();});
Observable.range(0, Integer.MAX_VALUE -1)
.scan(Observable.just(0), (acc, rangeIdx) -> acc.concatMap(getRequestB::call))
.concatMap(o -> o)
.takeUntil(i -> i > 100000)
.subscribe(System.err::println);