我是反应式编程范式的新手。我有一个简单的问题。
我有一个元素列表,对于每个元素我都必须进行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;
}
答案 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)
来避免它。