reactive-programming - Spring webflux 中的 flatMap() 与 subscribe()

标签 reactive-programming spring-webflux

我是 Spring WebFlux 的新手,正在尝试将我的 Spring MVC 应用程序转换为 webflux。我从我的服务中返回一个 Mono 单声道:

    List<Store> stores = new ArrayList();

当我做:
    mono.subscribe(stores::addAll);
    dataexchange.put("stores", stores);
    return Mono.just(dataexchange);

然后作为响应将商店填充为空列表。但是,我可以在返回响应后验证 subscribe() 是否正常工作。

当我做 :
    return mono.flatmap( (response) -> {
        dataexchange.put("stores", response));
        return Mono.just(dataexchange);
    });

然后在响应中填充商店。

有人可以解释一下这两者有什么区别吗? flatMap 是否阻塞?
提前致谢 !

最佳答案

mono.subscribe(stores::addAll);

是异步的。这意味着,你告诉单声道它现在可以 开始 评估。

你要做的是继续处理stores马上 - 很有可能Mono还没评价。

那么,你怎么能解决这个问题?

您可以 区块直到 Mono已完成:
mono.doOnNext(stores::addAll).block()

当然,这违背了响应式编程的目的。您正在阻塞主线程,直到操作完成,这可以在没有 Reactor 的情况下以更简单的方式实现。

正确的方法是将其余代码从头到脚更改为响应式。这类似于您的第二个示例,其中您调用 dataexchangeMono 的一部分,因此也被异步评估。

要吸取的重要教训是像 map 这样的操作。或 flatMap未对 Mono 的结果进行操作,但创建一个新的 Mono这为原始 Mono 的执行添加了另一个转换.只要Mono不评估,flatMapmap操作实际上并没有做任何事情。

我希望这有帮助。

关于reactive-programming - Spring webflux 中的 flatMap() 与 subscribe(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54647902/

相关文章:

java - 如何测量 webflux WebClient 方法的执行时间?

ScalaTest:断言阻塞语句

ios - RxSwift - Observable.generate - 使用附加映射处理顺序请求

java - Quarkus 支持 RxJava

java - 在 react 器中流动多个对象的有效/正确方法是什么

java - 使用WebFlux时如何使用HTTP DELETE发送正文?

java - Spring WebFlux WebClient timeout() 和 exchange()

javascript - 如何将数据从父组件发送到特定的动态创建的子组件?

spring-boot - 我可以使用从 Spring5 的 WebClient 返回的 Flux 的 block() 方法吗?

spring - 在 Spring Webflux 功能应用程序中验证请求的最佳方法是什么