Я решил эту проблему на Java, но та же теория должна работать и для вас.
На самом деле у вас есть два основных паттерна; Значение combineLatest
, за которым следуют withLatestFrom
значения. Если withLatestFrom
запускается первым, вы хотите пропустить значение combineLatest
.
Начнем с того, что сделаем withLatestFrom
наблюдаемым:
Observable<Result> wlf = o1.withLatestFrom(o2, f::apply);
Затем мы хотим создать наблюдаемый combineLatest
, который испускает единственное значение. Мы также хотим остановить эту наблюдаемую, когда срабатывает wlf
:
Observable<Result> cl = Observable.combineLatest(o1, o2, f::apply)
.take(1).takeUntil(wlf);
Наконец, сложите эти два наблюдаемых вместе ... Для удобства я сделал вспомогательный метод для приема любых двух наблюдаемых и двухфункциональный оператор:
public static <Result,
Param1, Source1 extends Param1,
Param2, Source2 extends Param2>
Observable<Result> combineThenLatestFrom(
final Observable<Source1> o1,
final Observable<Source2> o2,
final BiFunction<Param1, Param2, Result> f
) {
final Observable<Result> base = o1
.withLatestFrom(o2, f::apply);
return Observable
.combineLatest(o1, o2, f::apply)
.take(1).takeUntil(base)
.mergeWith(base);
}
А вот тестовый код, который я использовал для проверки метода:
public static void main(final String[] args) {
final TestScheduler scheduler = new TestScheduler();
final TestSubject<String> o1 = TestSubject.create(scheduler);
final TestSubject<String> o2 = TestSubject.create(scheduler);
final Observable<String> r = combineThenLatestFrom(o1, o2, (a, b) -> a + b);
r.subscribe(System.out::println);
o1.onNext("1");
o1.onNext("2");
o2.onNext("A");
o2.onNext("B");
o2.onNext("C");
o2.onNext("D");
o1.onNext("3");
o2.onNext("E");
scheduler.triggerActions();
}
Какие выходы:
2A
3D
person
flakes
schedule
03.02.2017