Я новичок в реактивном программировании (и я прочитал кучу подобных вопросов по SO). В моем текущем любимом проекте я столкнулся со следующей проблемой (я предоставляю псевдокод для рассматриваемого сценария).
Речь идет о фильтрации Mono и последующем определении того, был ли вызван Mono. В примере ниже:
[*]Я создаю Mono из входных данных [*]фильтр, если входной Строковый ресурс подходит для моего метода. [*]плоское сопоставление моего Mono с давно работающим Mono. Он меняет некоторые внутренние свойства системы, но ничего не возвращает. [*]если service.loadSmth был выполнен и завершен успешно, я хочу вызвать serviceContinueWork.doSmthElse()
public Mono выполнить (String resources) { вернуть Mono.just(ресурс) //Mono .filter(Objects::nonNull) //Mono .filter(msg -> msg.startsWith("http://")) //фильтрация Mono .flatMap(msg -> service.loadSmth(msg)) //плоская карта в Mono .doOnSuccess(команда -> serviceContinueWork.doSmthElse()) //!!! выполняется всегда
Какова закономерность такой ситуации? (Когда мы хотим определить, был ли вызван Mono, doOnNext и doOnSuccess не подходят.)
Насколько я понимаю, я всегда могу переключиться на service.loadSmth(msg), возвращая Mono, а затем doOnNext вместо doOnSuccess будет работать нормально.
Однако, похоже, должен быть какой-то способ различать эти случаи без ненужного изменения подписи. Мне нужно знать, был ли метод вызван «извне» - во внешнем вызывающем коде. Например, я бы не стал заставлять метод void doSmth() возвращать логическое значение, просто чтобы знать, был ли он вызван (в обычных, нереактивных/нефункциональных случаях).
Будем благодарны за любые советы/ссылки.
Мобильная версия