我必须调用此方法
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中实现这一点?
答案 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);
这是递归的,直到你的限制。希望这可以帮助你