Дождитесь окончания цикла подписки, прежде чем возвращать значение - PullRequest
0 голосов
/ 09 октября 2018

Я новичок в парадигме реактивного программирования.У меня простой вопрос.

У меня есть список элементов, для каждого элемента я должен выполнить вызов REST.

Я должен создать новый список на основе ответа этих вызовов.

Проблема в том, что моя функция возвращает значение до конца цикла ... Я не знаю, как это сделать?

Вот мой кусок кода:

TaeaUpdateRequestOutput putTaea(final String dossierId, final TaeaUpdateRequestInput input, final String token) {

    final TaeaUpdateRequestOutput output = new TaeaUpdateRequestOutput();

    input.getAdhesions().stream().forEach(adhesion -> {

        final Mono<TaeaFromMyMB> taeaResponse = doRest(adhesion, TaeaFromMyMB.class, url, token, dossierId);

        taeaResponse.subscribe(myMBTaea -> {
            final Taea taea = myMBTaea.fromTaeaFromMyMb(adhesion);
            output.getListeTaea().add(taea);
        });
    });
    //output is always empty due to async programming. How to wait the the end of the last iteration's subscription?
    return output;
}

1 Ответ

0 голосов
/ 09 октября 2018

Вы подписались taeaResponses, но не дождались результата подписки.

Попробуйте что-то вроде

    List<Taea> taeas = Flux.fromIterable(input.getAdhesions())
            .flatMap(adhesion -> doRest(adhesion, TaeaFromMyMB.class, url, token, dossierId)
                    .map(taeaFromMyMB -> taeaFromMyMB.fromTaeaFromMyMb(adhesion)))
            .collect(Collectors.toList())
            .subscribeOn(Schedulers.parallel())
            // wait result here
            .block();

Затем установите его на выход.

Помните, что block () ждет бесконечно, поэтому вы можете использовать reactor.core.publisher.Mono#block(java.time.Duration), чтобы избежать этого.

...