Как дождаться возврата функции моно значения в Mono.flatMap?

Mono<Student> studentMono = some1();
Mono<School> schoolMono = some2();

Mono<Person> categoryBestPageResponseMono = Mono
    .zip(studentMono, schoolMono)
    .flatMap(data -> {
        Student student = data.getT1();
        School school = data.getT2();
        Person person = Person.builder()
                             .student(student)
                             .school(school)
                             .build();
       return Mono.just(person);
    })
    .flatMap(person -> {
       Mono<PassInfo> passInfoMono = getPassOrfail(person.student.id, person.school.number);

       //pass info is null when first and second get from cache not null
       passInfoMono.subscribe(passInfo -> person.setPassInfo(passInfo));
       return Mono.just(person);
    });

В приведенном выше источнике я всегда получаю null вместо passInfo.

Как я могу дождаться операции getPassOrfail и поставить passInfo в person в сеттере?

Тег mono не имеет ничего общего с Java. Не злоупотребляйте этим.

Lex Li 21.02.2023 06:53

Код не компилируется на Mono.just(student).

Nikolas Charalambidis 21.02.2023 06:59

@NikolasCharalambidis жаль, что это было person

EdgarHan 21.02.2023 07:06
1
3
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я бы использовал преимущество цепочки. Кстати. все это можно упростить до простого фрагмента:

Mono<Person> categoryBestPageResponseMono = Mono
    .just(Person.builder()
            .student(some1())
            .school(some2())
            .build())
    .flatMap(person -> getPassOrfail(person.student.id, person.school.number)
            .doOnSuccess(person::setPassInfo)
            .thenReturn(person));
  1. Не подписывайтесь нигде на протяжении всего вашего реактива без надобности
  2. Не используйте flatMap() нигде, я вижу, вы используете его для полностью синхронных операций, а затем просто делаете Mono.just(...) в операторе return. Для синхронных операций есть оператор .map()
  3. Не обращайтесь к полям объекта напрямую. Они должны быть приватными, использовать геттеры и сеттеры
  4. Вам не нужно «ждать». Это реактивная структура, которая по своей природе асинхронна, поэтому просто добавьте в свою цепочку соответствующие обратные вызовы.
    Mono.zip(studentMono, schoolMono)
            .map(data -> {
                Student student = data.getT1();
                School school = data.getT2();

                Person person = Person.builder()
                        .student(student)
                        .school(school)
                        .build();
                return person;
            })
            .flatMap(person -> getPassOrfail(person.getStudent().getId(), person.getSchool().getNumber())
                    .map(passInfo -> {
                        person.setPassInfo(passInfo);
                        return person;
                    })
            );
Don't subscribe anywhere throughout your reactive without any needs что значит? Как я могу использовать подписку вместо doOnXXX. Я думаю, что это то же самое.
EdgarHan 23.02.2023 05:56

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