在返回值之前等待订阅循环结束
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)
来避免它。
我是反应式编程范例的新手。我有一个简单的问题。
我有一个元素列表,我必须为每个元素执行 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)
来避免它。