在RxJava中循环遍历异步操作

时间:2017-01-25 01:40:37

标签: rx-java

我必须调用此方法

Observable<Boolean> doOperation(int i);

多次。问题是,在我继续前进之前,我必须等待之前的Observable完成。我知道我可以这样做:

Observable.just(null)
    .flatMap(v -> doOperation(1))
    .flatMap(v -> doOperation(2))
    .flatMap(v -> doOperation(3))

然而,我真的希望做这样的事情:

Observable.range(1, 10)
    .flatMap(i -> doOperation(i))

然而,在后一种结构中,范围运算符以全速运行并立即发送所有10个运算。操作的性质要求我等到doOperation(1)完成后再触发doOperation(2)等。

我想知道在上面的第一个例子旁边是否有某种方法可以在Rx中实现这一点?

2 个答案:

答案 0 :(得分:2)

知道了!您可以使用concatMap()代替flatMap()。在订阅Observable n + 1之前,ConcatMap将一直等到Observable n完成。

您可以通过创建方法

来看到这一点
private static Observable<Integer> doOperation(int i)
{
    logger.info("Calling method with [{}]", i);
    return Observable.just(i).delay(1, TimeUnit.SECONDS).subscribeOn(Schedulers.io());
}

然后订阅该流。

Observable.range(1, 10)
    .concatMap(i -> doOperation(i))
    .subscribe(System.out::println);

答案 1 :(得分:0)

使用PublishSubject可以轻松实现。在doSomeOperation(integer)方法中,您需要调用limit.onNext(YOUR_NEXT_INTEGER)以在当前结束时进行下一次调用。如您所见,doSomeOperation(integer)仅在当前操作完成时调用下一个操作,因此操作之间不会交错。

PublishSubject<Integer> limit = PublishSubject.create();

        limit.concatMap(doSomeOperation(integer))
                .subscribe();
        limit.onNext(1);

这是递归的,直到你的限制。希望这可以帮助你