gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:50:45 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com