压缩三种不同类型的Mono,并在Spring Boot中返回响应

压缩三种不同类型的Mono,并在Spring Boot中返回响应,spring,kotlin,Spring,Kotlin,我想进行两个异步webclient调用。 然后等待两个响应,使用一些业务逻辑并返回一些值。 下面的代码是我所写内容的简单版本。 然而,我不确定它是否是好代码 @RequestMapping(value = ["/{userId}"], method = [RequestMethod.GET]) fun getRoomList(@PathVariable("userId") userId: String): RoomDto.FullInfo {

我想进行两个异步webclient调用。 然后等待两个响应,使用一些业务逻辑并返回一些值。 下面的代码是我所写内容的简单版本。 然而,我不确定它是否是好代码

@RequestMapping(value = ["/{userId}"], method = [RequestMethod.GET])
fun getRoomList(@PathVariable("userId") userId: String): RoomDto.FullInfo {
    
    val countDownLatch = CountDownLatch(2)
    val roomPriceSumListMono = Room.getRoomPriceSumMono(webClient, roomPriceSumDto) //remote call

    roomPriceSumListMono.subscribe {
        //some logic
        countDownLatch.countDown()
    }

    val userListInRoomListMono = roomService.getUserListInRoomListMonoFromRemote(webClient, userIdListInRoomList) //remote call       
    var userListInRoomList: List<List<UserDto.Info>>? = null
    userListInRoomListMono.subscribe{
        //some logic
        countDownLatch.countDown()
    }
    
    countDownLatch.await()
    return RoomDto.FullInfo(roomInfoList, userListInRoomList, userRoomCap, maxRoomCount)
}

是否有更好的方法等待async
WebClient
调用,然后返回一些数据?

注意:如果您添加有关错误的详细信息,我可能会修改此答案,因为我只是粗略地猜测您的问题

对于您的用例,Zip确实是正确的操作符。在第二个示例中,语法为java one,因此无法在Kotlin中使用,因为:

  • Lambda语法不同(参数应在括号后声明)
  • return
    在lambdas中并不意味着从lambda返回。要从lambda返回值,只需在lambda的最后一行调用该值
  • 有关中lambda语法的详细信息

    否则,您应该让SpringWebFlux处理管道,并将第一个函数的返回值封装在Mono中。完成后,您应该能够使用zip运算符:

    @RequestMapping(value = ["/{userId}"], method = [RequestMethod.GET])
    fun getRoomList(@PathVariable("userId") userId: String): Mono<RoomDto.FullInfo> {
        
        val roomPriceSumListMono = Room.getRoomPriceSumMono(webClient, roomPriceSumDto)
        val userListInRoomListMono = roomService.getUserListInRoomListMonoFromRemote(webClient, userIdListInRoomList)
    
        return roomPriceSumListMono
                .zipWith(userListInRoomListMono) {
                    roomPriceList, userListInRoomList -> 
                        RoomDto.FullInfo(roomInfoList, userListInRoomList, userRoomCap, maxRoomCount)
                }
    }
    
    @RequestMapping(值=[“/{userId}]”,方法=[RequestMethod.GET])
    有趣的getRoomList(@PathVariable(“userId”)userId:String):Mono{
    val roomPriceSumListMono=Room.getRoomPriceCallo(网络客户端,roomPriceSumDto)
    val userListInRoomListMono=roomService.getUserListInRoomListMonoFromRemote(webClient,userIdListInRoomList)
    返回房间价格表
    .zipWith(userListInRoomListMono){
    roomPriceList,userListInRoomList->
    RoomDto.FullInfo(roomInfoList、userListInRoomList、userRoomCap、maxRoomCount)
    }
    }
    
    谢谢您的回答。我现在很忙,所以我没有测试您的代码,但我认为这很有帮助。似乎应该删除lambda表达式中的括号<代码>删除括号后返回roomPriceSumListMono.zipWith(userListInRoomListMono){roomPriceList,userListInRoomList->RoomDto.FullInfo(roomInfoList,userListInRoomList,userRoomCap,maxRoomCount)}。谢谢。哦,对不起。修好了。很高兴听到它解决了你的问题。没问题。我不知道kotlin中的lambda语法与java不同。你救了我一天。再次感谢。
    @RequestMapping(value = ["/{userId}"], method = [RequestMethod.GET])
    fun getRoomList(@PathVariable("userId") userId: String): Mono<RoomDto.FullInfo> {
        
        val roomPriceSumListMono = Room.getRoomPriceSumMono(webClient, roomPriceSumDto)
        val userListInRoomListMono = roomService.getUserListInRoomListMonoFromRemote(webClient, userIdListInRoomList)
    
        return roomPriceSumListMono
                .zipWith(userListInRoomListMono) {
                    roomPriceList, userListInRoomList -> 
                        RoomDto.FullInfo(roomInfoList, userListInRoomList, userRoomCap, maxRoomCount)
                }
    }