等待订阅循环结束,然后再返回值

时间:2018-10-09 11:57:35

标签: spring-webflux reactor

我是反应式编程范式的新手。我有一个简单的问题。

我有一个元素列表,对于每个元素我都必须进行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 :(得分:0)

您订阅了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)来避免它。