可观察vs可完成为什么不调用可完成任务?

因此,刚接触RX Java的人有一个问题。


在我学习作为RXJava的野兽的探险中,这是我受测的课程。


public class PollingLoop {


public static <T> Observable<T> buildObservable(

    final int interval,

    final TimeUnit timeUnit,

    final int maxJitter,

    final Scheduler scheduler,

    final Supplier<Observable<T>> scheduledTask) {


    if (maxJitter <= 0) throw new IllegalArgumentException("Jitter must be greater than 0");


    final Random randomJitter = new Random();

    return Observable.timer(interval, timeUnit, scheduler)

        .map(x -> {

            System.out.println("Flat map jitter");

            return randomJitter.nextInt(maxJitter);

        })

        .flatMap(jitter -> {

            System.out.println("Flat map timer");

            return Observable.timer(jitter, timeUnit, scheduler);

        })

        .flatMap(ignored -> {

            System.out.println("Flat map task");

            return scheduledTask.get();

        })

        .retry()

        .repeat();

}


public static <T> Completable buildCompletable(

    final int interval,

    final TimeUnit timeUnit,

    final int maxJitter,

    final Scheduler scheduler,

    final Supplier<Completable> scheduledTask) {


    if (maxJitter <= 0) throw new IllegalArgumentException("Jitter must be greater than 0");


    final Random randomJitter = new Random();

    return Observable.timer(interval, timeUnit, scheduler)

        .map(x -> {

            System.out.println("Flat map jitter");

            return randomJitter.nextInt(maxJitter);

        })

        .flatMapCompletable(jitter -> {

            System.out.println("Flat map timer");

            return Completable.timer(jitter, timeUnit, scheduler);

        })

        .flatMapCompletable(ignored -> {

            System.out.println("Flat map task that is not called");

            return scheduledTask.get();

        })

        .retry()

        .repeat()

        .toCompletable();

}

}

从测试中,当我测试Observable的执行延迟时,得到输出


Flat map jitter

Flat map timer

Flat map task //(observable is being called)

我究竟做错了什么?为什么未从buildCompletable内部调用Completable任务?


小怪兽爱吃肉
浏览 161回答 1
1回答

德玛西亚99

您的第flatMapCompletable()一个结果是可完成的,因为这就是您要返回的结果。但是,该可填充对象将永远不会发出值(根据定义),因此后继flatMapCompletable()映射没有任何值。由于您的第一个Completable不发出值,因此您将需要使用andThen()运算符或类似方法绑定下一步。因为flatMapCompletable()操作符具有的签名,所以您的代码得以编译Observable<Long>。您将需要将andThen()运算符放入flatMapCompletable()函数中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java