首页 > 解决方案 > 在不丢失第一个结果的情况下调用第二个 Mono 的最佳方法是什么?

问题描述

我的代码需要与两个反应性依赖项交互 - 保存到数据库并发布到流,每个都返回Mono实例。在此之后,我需要做更多的处理 - 全部使用我开始使用的原始对象,如下所示:

val myObject = Mono.just(“thing”);
myObject.flatMap(repository::save)
        .flatMap(stream::publish)
        .map(obj -> moreProcessing(obj));

但问题是,repository.save不返回Mono我感兴趣的对象的 a ,也不返回stream.publish.

我可以通过以下方式实现我想要的:

myObject.flatMap(obj -> repository.save(obj).then(Mono.just(obj))
        .flatMap(obj -> stream.publish(obj).then(Mono.just(obj))
        .map(obj -> moreProcessing(obj));

即映射到依赖函数只是为了获取它们的行为,然后再直接映射回来,但这看起来很奇怪——就像我可能错过了一些更好的方法来使用 API,它不会提示我在类型之间进行映射,因为那不是我正在使用flatMap的,真的。

我也可以使用类似的东西:

myObject.flatMap(obj ->
            repository.save(obj)
                .flatMap(x -> publisher.stream(obj))
                .map(x -> moreProcessing(obj)));

但这似乎也不是一个好方法,因为即使在相对简单的情况下,它也会导致难以维护的代码。

想法?

标签: javaspring-webfluxproject-reactor

解决方案


你试过了thipWhen吗?它的行为就像您希望的那样,唯一的限制是,如果 的结果rightGenerator为空(没有下一个信号),它会立即完成。因此,您需要返回一个Optionalor 使用thenReturnor switchIfEmpty


推荐阅读