Rx java 改造顺序';请求,其中下一个请求取决于上一个请求的结果

Rx java 改造顺序';请求,其中下一个请求取决于上一个请求的结果,rx-java,rx-android,Rx Java,Rx Android,我有一系列改装请求: Observable.interval(0, Integer.MAX_VALUE - 1).concatMap(index -> index == 0 ? getRequestA() : getRequestB()).takeUntil(<condition>) 我如何做到这一点?您可以使用flatMap,例如 getRequestA().flatMap(a -> getRequestB(a)) .flatMap(b -&

我有一系列改装请求:

Observable.interval(0, Integer.MAX_VALUE - 1).concatMap(index -> index == 0 ? getRequestA() : getRequestB()).takeUntil(<condition>)

我如何做到这一点?

您可以使用
flatMap
,例如

getRequestA().flatMap(a -> getRequestB(a))
             .flatMap(b -> getRequestB1(b))
             .flatMap(b1 -> getRequestB2(b1))
             ...
因为每个事件都会使用前一个事件中的某些内容,所以可能就是您要查找的运算符

累加器将是“截至当前事件”的组合可观测值

下面是一个示例实现:

    // 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);
//伪/sample getRequestB
Func1 getRequestB=i->Observable.create(sub->{sub.onNext(2*i+1);sub.onCompleted();});
可观察范围(0,整数.MAX_值-1)
.scan(可观察的.just(0),(acc,rangeIdx)->acc.concatMap(getRequestB::call))
.concatMap(o->o)
.takeUntil(i->i>100000)
.subscribe(System.err::println);

这只适用于有限/已知数量的链式进程,我使用扫描添加了一个答案,因为我相信作者正在寻找答案。谢谢Gluck。我还需要一些帮助。您说过累加器将是“直到当前事件”的组合可观察对象,但我需要累加器仅从可观察对象序列中获取之前的可观察对象或最后一项。示例代码:。预期行为-如果在累积lambda函数体中监视注销-我得到的累积函数执行太多,因此请求B的调用太多。示例添加在第47行:日志(索引)-我得到:0-第一个事件,0 1-第二个事件,0 1 2-第三个事件。这是一种预期的扫描行为——“将一个函数应用于一个可观察的、连续的、并发出每个连续值的每个项目”。我不需要按顺序-我需要这个顺序的上一个值。
    // 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);