Есть ли наблюдаемые кеши испускаемые предметы? У меня есть два испытания, которые приводят меня к разным выводам:Наблюдаемые кеши испускают предметы или нет?
От испытываемого # 1 я делаю вывод о том, что он делает:
Test # 1:
Observable<Long> clock = Observable
.interval(1000, TimeUnit.MILLISECONDS)
.take(10)
.map(i -> i++);
//subscribefor the first time
clock.subscribe(i -> System.out.println("a: " + i));
//subscribe with 2.5 seconds delay
Executors.newScheduledThreadPool(1).schedule(
() -> clock.subscribe(i -> System.out.println(" b: " + i)),
2500,
TimeUnit.MILLISECONDS
);
Выход №1:
a: 0
a: 1
a: 2
b: 0
a: 3
b: 1
Но второй тест показывает, что мы получаем разные значения для двух наблюдателей:
Test # 2:
Observable<Integer> observable = Observable
.range(1, 1000000)
.sample(7, TimeUnit.MILLISECONDS);
observable.subscribe(i -> System.out.println("Subscriber #1:" + i));
observable.subscribe(i -> System.out.println("Subscriber #2:" + i));
Выход # 2:
Subscriber #1:72745
Subscriber #1:196390
Subscriber #1:678171
Subscriber #2:336533
Subscriber #2:735521
но как rx lib знает, имеет ли код внешний эффект? Из-за того, что горячие наблюдаемые могут быть превращены в холод в любой момент, я делаю вывод, что как холодные, так и горячие наблюдатели должны помнить/кэшировать каждый испускаемый предмет, верно? Выглядит немного неэффективно –
Вы не можете знать, и обычно это даже не актуально. Это ваш выбор, чтобы сохранить последовательности с кешем(), replay() или ReplaySubject. – akarnokd
Да, вот почему я смущен. Я мог бы вызвать .cache(), но rx кэширует список всех элементов в любом месте. По крайней мере, я сделал этот вывод из теста №1 –