繁体   English   中英

什么是 Webflux 中的 MonoNext 以及如何在 flatMap 和 map 之间选择使用哪个

[英]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());
                        })
        );
    }

那么我的问题是,如何更好地理解MonoNextflatMap (又名,我通过替换map让上面的代码工作,但我不明白为什么它不起作用,以及为什么以后会起作用)

TL;DR如果操作是异步的(返回MonoFlux )- 使用flatMap ,对于同步逻辑使用map

在您订阅之前,反应式不会发生任何事情。 flatMap订阅提供的发布者,返回另一个MonoFlux发出的值。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM