在返回值之前等待订阅循环结束

Wait the end of a subscription loop before returning value

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

我有一个元素列表,我必须为每个元素执行 REST 调用。

我必须根据这些调用的响应构建一个新列表。

问题是我的函数 returns 循环结束前的值... 我不知道怎么办?

这是我的一段代码:

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;
}

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