Spring webflux 中的 flatMap() 与 subscribe()
flatMap() vs subscribe() in Spring webflux
我是 Spring WebFlux 的新手,正在尝试将我的 spring MVC 应用程序转换为 webflux。我 return 来自我的服务的 Mono mono :
List<Store> stores = new ArrayList();
当我这样做时:
mono.subscribe(stores::addAll);
dataexchange.put("stores", stores);
return Mono.just(dataexchange);
然后 stores 被填充为空列表作为响应。但是,我可以在 returning 响应后验证 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 的情况下以更简单的方式实现。
正确的方法是将其余代码从头到脚更改为响应式。这类似于您的第二个示例,您对 dataexchange
的调用是 Mono
的一部分,因此也被异步评估。
要吸取的重要教训是像 map
或 flatMap
这样的操作不是对 Mono
的结果进行操作,而是创建一个新的 Mono
将另一个转换添加到原始 Mono
的执行中。只要 Mono
不计算,flatMap
或 map
操作实际上就没有做任何事情。
希望对您有所帮助。
我是 Spring WebFlux 的新手,正在尝试将我的 spring MVC 应用程序转换为 webflux。我 return 来自我的服务的 Mono mono :
List<Store> stores = new ArrayList();
当我这样做时:
mono.subscribe(stores::addAll);
dataexchange.put("stores", stores);
return Mono.just(dataexchange);
然后 stores 被填充为空列表作为响应。但是,我可以在 returning 响应后验证 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 的情况下以更简单的方式实现。
正确的方法是将其余代码从头到脚更改为响应式。这类似于您的第二个示例,您对 dataexchange
的调用是 Mono
的一部分,因此也被异步评估。
要吸取的重要教训是像 map
或 flatMap
这样的操作不是对 Mono
的结果进行操作,而是创建一个新的 Mono
将另一个转换添加到原始 Mono
的执行中。只要 Mono
不计算,flatMap
或 map
操作实际上就没有做任何事情。
希望对您有所帮助。