如何在不阻塞的情况下渲染具有两个通量场的对象?

Posted

技术标签:

【中文标题】如何在不阻塞的情况下渲染具有两个通量场的对象?【英文标题】:how to render an object with two flux fields without blocking? 【发布时间】:2021-12-29 03:30:19 【问题描述】:

我想渲染一个由两个单声道或通量元素组成的对象(在代码 sn-p 下方):

 Mono<List<NodeDTO>> nodeDTOFlux = this.webClient
            .get()
            .uri(NODES_WITH_LIMIT + limit)
            .retrieve()
            .onStatus(HttpStatus::isError,
                    response -> response.bodyToMono(String.class).flatMap(
                            msg -> Mono.error(new ApiCallException(msg, response.statusCode())))
            )
            .bodyToFlux(new ParameterizedTypeReference<Node>() 
            ).map(node -> nodeMapper.toNodeDTO(node))
            .collectList();



    Mono<List<EdgeDTO>> edgeDTOFlux = this.webClient
            .get()
            .uri(EDGES_WITH_LIMIT + limit)
            .retrieve()
            .onStatus(HttpStatus::isError,
                    response -> response.bodyToMono(String.class).flatMap(
                            msg -> Mono.error(new ApiCallException(msg, response.statusCode())))
            )
            .bodyToFlux(new ParameterizedTypeReference<Edge>() 
            ).map(edge -> edgeMapper.toEdgeDTO(edge))
            .collectList();

我尝试了 zip() 方法,但这不是我的目标 我试图返回这样的对象

    GraphDataDTO graphDataDTO = new GraphDataDTO();
    graphDataDTO.setEdgeDTOS(edgeDTOFlux);
    graphDataDTO.setNodeDTOS(nodeDTOFlux);

我的控制台中有结果,但对象返回 “nodeDTOS”: “扫描可用”:真 , “边缘DTOS”: “扫描可用”:真 返回是在获得所有通量之前完成的。有没有不阻塞的解决方案! 提前致谢。

【问题讨论】:

你用 zip() 试过什么? return Mono.zip(nodeDTOFlux, edgeDTOFlux).map( Tuple2::toList ).map(objects -> ) .flatMapMany(Flux::fromIterable); 它将所有东西组合在同一个对象中,但我想得到像 "nodeDTOS": [ , ..], "edgeDTOS": [ , .. ] 【参考方案1】:

这应该可行:

return Mono.zip(nodeDTOFlux, edgeDTOFlux)
      .map(tuple2 -> GraphDataDTO.builder().nodeDTO(tuple2.getT1()).edgeDTO(tuple2.getT2()).build())

它创建一个 NodeDTOEdgeDTO 的元组并将其映射到 GraphDataDTO

【讨论】:

以上是关于如何在不阻塞的情况下渲染具有两个通量场的对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不阻塞的情况下从 Spring Webflux 中的 Mono 对象中提取数据?

Flutter:如何在不阻塞 UI 的情况下异步地从资产中读取文件

如何在不阻塞 UI 的情况下正确使用 MagicalRecord 从 Web 服务导入数据

在不阻塞 dom 的情况下从后端渲染 ($compile) html 到视图中

如何在不合并索引的情况下连接具有不同多索引的两个数据帧?

如何在不阻塞的情况下发出请求(使用 asyncio)?