我是Spring WebFlux的新手,正在尝试将spring MVC应用程序转换为webflux。我从服务中返回了Mono 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是否受阻? 预先感谢!
答案 0 :(得分:1)
mono.subscribe(stores::addAll);
是异步的。也就是说,您告诉Mono,它现在可以开始评估。
您要做的是立即继续处理stores
-很有可能Mono
尚未得到评估。
那么,如何解决这个问题?
您可以阻止,直到Mono
完成:
mono.doOnNext(stores::addAll).block()
当然,这违背了反应式编程的目的。您将阻塞主线程,直到操作完成为止。如果没有Reactor,则可以以一种更简单的方式来实现。
正确的方法是将代码的其余部分也从头到脚更改为可响应的。这类似于您的第二个示例,其中您对dataexchange
的调用是Mono
的一部分,因此也被异步评估。
要学习的重要教训是,map
或flatMap
之类的操作不是基于Mono
的结果进行操作,而是创建一个新的Mono
来添加另一个转换为原始Mono
的执行。只要Mono
不评估,flatMap
或map
操作实际上就不会做任何事情。
我希望这会有所帮助。