Java 可观察与可完成为什么不调用可完成任务?
刚接触RX Java的朋友们,我有个问题 在我学习野兽RXJava的探险中,这是我正在测试的类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,
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我发现问题后不久,但你是对的。