Отложить первого наблюдателя до тех пор, пока все остальные наблюдатели не будут вызваны в RxJava

У меня есть наблюдаемое событие, которое может иметь несколько наблюдателей.

Первый наблюдатель всегда является очищающим кодом, который удаляет все остальные подписки на наблюдаемый объект (это связано с тем, что все остальные наблюдатели могут быть добавлены позже некоторыми другими частями кода).

CompositeDisposable disposable = new CompositeDisposable();
Observable<Object> eventObservable = Observable.just(1);

disposable.add(eventObservable.subscribe(event -> {
    disposable.dispose();
    System.out.println("Observer 1");
}));

disposable.add(eventObservable.subscribe(event -> {
    System.out.println("Observer 2");
}));

disposable.add(eventObservable.subscribe(event -> {
    System.out.println("Observer 3");
}));

Текущий выход:

Observer 1

Ожидаемый результат:

Observer 2
Observer 3
Observer 1

Один из способов добиться этого — добавить delay для первого наблюдателя. Но это не похоже на правильный способ сделать это.

Можно ли правильно гарантировать, что первый наблюдатель всегда вызывается после вызова других существующих наблюдателей?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сделайте шаг назад; вам не нужно заниматься ручным удалением всех промежуточных этапов.

Observable<Object> eventObservable = Observable.just(1).take(1).share();

Это автоматически прекратится после 1 события, и это будет распространено на все подписки на eventObservable. Нет необходимости в ручной очистке.

Спасибо за ваш ответ. Но я все же хотел бы знать, возможно ли с учетом настроек, которые я предоставил, отложить выполнение первого наблюдателя. Это довольно легко сделать в RxJS из-за одного потока и цикла событий, но я не нашел способа сделать это в RxJS. Я приму ваш текущий ответ, если вы не думаете, что это возможно.

Ostap Maliuvanchuk 20.05.2019 10:58

Вы не можете задержаться в обработчике подписки, так как это нарушает асинхронную гарантию реактивных потоков.

Tassos Bassoukos 20.05.2019 23:27

Другие вопросы по теме