[英]Refactor subscribe() to map()/flatMap() Spring Webflux
[英]what is a MonoNext in Webflux and how to choose which one to use between flatMap and map
下面的代码是要先从redis中删除一个KV,然后在那里设置一个新的KV并返回。 但它实际上从未在delete
之后set
。 我只在打印每条log
后看到错误,因为2 any is MonoNext
。 然后我在这any
发布了一个链步骤,需要拆分一个Mono
,所以我在标记处使用flatMap
而不是map
。 这个问题更可能发生在我身上,尤其是当函数被深度封装在另一个Mono
中时,进出 Mono。
@RequestMapping("addUserSimple3")
public Mono<AddUserResponse> addUser3(@RequestBody Mono<AddUserVo> vo) {
return vo.flatMap(v ->
redisOps.delete(v.getGroupId())
.map(any -> { <---------------------Use flatMap instead of map
log.info("1 any is {}", any);
return redisOps.set(v.getGroupId(), v.getPersonId());
})
.map(any ->
{
log.info("2 any is {}", any);
return new AddUserResponse(ResponseState.GOOD, v.getLogId());
})
);
}
那么我的问题是,如何更好地理解MonoNext
和flatMap
? (又名,我通过替换map
让上面的代码工作,但我不明白为什么它不起作用,以及为什么以后会起作用)
TL;DR如果操作是异步的(返回Mono
或Flux
)- 使用flatMap
,对于同步逻辑使用map
。
在您订阅之前,反应式不会发生任何事情。 flatMap
订阅提供的发布者,返回另一个Mono
或Flux
发出的值。 map
只是转换应用同步 function 的值。
@RequestMapping("addUserSimple3")
public Mono<AddUserResponse> addUser3(@RequestBody Mono<AddUserVo> vo) {
return vo.flatMap(v ->
redisOps.delete(v.getGroupId())
.flatMap(res -> redisOps.set(v.getGroupId(), v.getPersonId()))
.map(res -> new AddUserResponse(ResponseState.GOOD, v.getLogId()))
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.