在JS承诺中你可以使用 Promise.join
但我无法找到Flux / Mono的解决方案。当您处理不同的物品然后必须在以后一起使用它们时,最佳做法是什么?
答案 0 :(得分:2)
这取决于你想要如何组合它们。
顺序?使用Flux.concat
一切并行?使用Flux.zip
如果您只期望一个结果,Mono.zipWith
可能适合您。
答案 1 :(得分:2)
有很多'合并运营商' zip,concat,merge,combine最多是三个。
Zip允许您组合流,其中项目将在流中以1对1的关系分组。这就是你输掉最后一个元素的原因。
如果您不确定每个流的数量以及它将提供事件的频率,您可以使用concat(在第一个流的末尾添加其他流),合并(其中项目放在最终流中)从两个流的出现顺序),或结合最新(将每个流的两个最后事件变为其他)。
你的案子听起来像是合并给我。
答案 2 :(得分:0)
经过一些更改后,我的代码看起来像这样
public Mono<Item> createItem(final @NonNull String userName, String description, String[] tags,
@NonNull Flux<ImageDTO> photos) {
val item = initItem(userName);
item.setDescription(description);
if (null != tags) {
item.getTags().addAll(Arrays.asList(tags));
}
return photos.flatMap(photo -> imageService.storeImage(photo.getStream(), photo.getExt()))
.reduce(item, (item1, photoIri) -> {
item1.getPhotos().add(photoIri);
return item1;
})
.flatMap(itemRepository::save)
.flatMap(createdItem -> {
val itemHistory = getHistoryForCreatedItem(userName, createdItem);
return itemHistoryRepository.save(itemHistory).then(Mono.just(createdItem));
});
}
目前我不喜欢: