RxJava 1.3-Amb不会订阅或取消订阅速度较慢的流

时间:2018-07-11 08:10:37

标签: rx-java

    Observable<Object> obs1 = Observable
            .create(subscriber -> subscriber.onNext("obs 1 event"))
            .doOnSubscribe(() -> System.out.println("obs1 sub"))
            .doOnUnsubscribe(() -> System.out.println("obs1 unsub"));

    Observable<Object> obs2 = Observable
            .create(subscriber -> subscriber.onNext("obs 2 event"))
            .doOnSubscribe(() -> System.out.println("obs2 sub"))
            .doOnUnsubscribe(() -> System.out.println("obs2 unsub"));

    Observable
            .amb(obs1, obs2)
            .subscribe(System.out::println);

    Thread.sleep(500);
应该调用

obs2 doOn *方法,并且仅应发出两个事件中的一个。程序输出:

obs1 sub
obs 1 event

没有调用obs2的* subscribe方法。

1 个答案:

答案 0 :(得分:1)

RxJava源和操作符默认情况下是同步的,除非它们使用调度程序引入异步。上面的代码均未涉及任何调度程序,因此执行将是同步的。 amb不会尝试订阅第二个,因为第一个已经赢得了比赛。

  

当我将just替换为create时,它会像我期望的那样工作

just产生不同结果的原因是背压,您在弃用的create使用中并未实现该背压。 amb首先订阅源,然后再订阅源的请求,这样您便获得了订阅的副作用。如果您的实现失败,则第一个来源会立即推送其项目,从而使amb进入获胜状态,从而防止第二个订阅发生。