Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可观察与可完成为什么不调用可完成任务?_Java_Rx Java - Fatal编程技术网

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

Java 可观察与可完成为什么不调用可完成任务?,java,rx-java,Java,Rx Java,刚接触RX Java的朋友们,我有个问题 在我学习野兽RXJava的探险中,这是我正在测试的类 public class PollingLoop { public static <T> Observable<T> buildObservable( final int interval, final TimeUnit timeUnit, final int maxJitter, final Scheduler scheduler,

刚接触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();
}
}
但是当我测试一个完成表的执行延迟时,我得到了输出

Flat map jitter
Flat map timer
Flat map task //(observable is being called)
Flat map jitter
Flat map timer
//未调用可完成任务

我做错了什么?为什么不能从buildCompletable中调用Completable任务

这是用斯波克写的测试

def 'should delay execution of observable'() {
    given:
    def subscriber = new TestSubscriber<>()
    def scheduler = new TestScheduler()
    def supplier = Mock Supplier

    supplier.get() >> Observable.just(true)

    when:
    PollingLoop.buildObservable(100, TimeUnit.MILLISECONDS, 1, scheduler, supplier).subscribe(subscriber)
    scheduler.advanceTimeBy(101, TimeUnit.MILLISECONDS)

    then:
    subscriber.assertValueCount(1)
    subscriber.assertValue(true)
}

    def 'should delay execution of completable'(){
    given:
    def subscriber = new TestSubscriber<>()
    def scheduler = new TestScheduler()
    def supplier = Mock Supplier
    supplier.get() >> Completable.complete()

    when:
    PollingLoop.buildCompletable(100, TimeUnit.MILLISECONDS, 1, scheduler, supplier).subscribe(subscriber)

    scheduler.advanceTimeBy(1001, TimeUnit.MILLISECONDS)
enter code here
    then:
    1 * supplier.get()
}
第一个flatMapCompletable的结果是一个completable,因为这是您返回的结果。但是,该completable将不会根据定义发出值,因此后续flatMapCompletable没有要映射的值

由于您的第一个Completable没有发出值,因此需要使用andThen运算符或类似的方法绑定下一步


由于flatMapCompletable运算符具有Observable的签名,因此代码可以编译。您需要在flatMapCompletable函数中放入第n个运算符。

我甚至不确定它是如何编译的。第一个flatMapCompletable返回Completable,它没有flatMapCompletable方法,该方法使senseit编译时没有任何问题,但它没有从第一个flatMapCompletable链接到第二个flatMapCompletable。为了解决这个问题,我不得不去定时器->映射->平面映射->平面映射可完成->重试->……我不明白,我们是否错过了这里的附加代码?这是一个编译错误,当我复制粘贴它,请提供完整的codecheers@Bob我发现问题后不久,但你是对的。