如何在不使用 block() 的情况下使用 Mono 的 return 对象?

How to use return object of Mono without using block()?

我正在努力学习 spring webflux。在 ReactiveMongoRepository 中,我正在尝试检查类别是否已存在。如果它已经存在,则 return 否则保存该对象并 return 新保存的对象。像下面这样的东西。

public Mono<Category> save(Category category) {
    final Mono<Category> byId = repository.findById(category.getId());
    final Category block = byId.block();
    if (block == null) {
        return repository.save(new Category(category.getName()));
    } else {
        return byId;
    }
}

如何不使用 block() 来执行此操作?

使用 Mono::switchIfEmpty 提供替代方案 Mono 以防前一个在没有数据的情况下完成。只要ReactiveMongoRepository::savereturnsMono就可以通过生成备选的

return repository.findById(category.getId())
                 .switchIfEmpty(repository.save(new Category(category.getName())));

如果ReactiveMongoRepository::findById returns一个Mono有数据,Mono::switchIfEmpty将不会被调用。

编辑:Mono::deferSupplier<Mono> 结合使用可在必要时延迟保存操作:

.switchIfEmpty(Mono.defer(() -> repository.save(new Category(category.getName()))));

你可以试试这样的

public Mono<Category> getCategories(Category category) {
   return repository.findByName(category.getName()).doOnNext(o -> {
   }).switchIfEmpty(repository.save(category));
}

您需要推迟 switchIfEmpty。否则会急切触发:

return repository.findById(category.getId())
                 .switchIfEmpty(Mono.defer(() ->respository.save(category)));