我想异步调用两个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)
}
我试着用 Mono.zip
但我不能像下面那样使用它。
Mono.zip(mono1, mono2, (m1, m2) -> {
//some login
return RoomDto.FullInfo(roomInfoList, userListInRoomList, userRoomCap, maxRoomCount)
}
有没有更好的异步等待方法 WebClient
打电话然后返回一些数据?
1条答案
按热度按时间iqjalb3h1#
注意:如果您添加有关错误的详细信息,我可能会修改此答案,因为我只是粗略地猜测您的问题。
zip确实是适合您的用例的操作符。在第二个示例中,语法是java one,因此无法在kotlin中工作,因为:
lambda语法不同(参数应在括号后声明)
return
在lambdas中并不意味着从lambda返回。要从lambda返回值,只需在lambda的最后一行中调用该值。关于官方文档中lambda语法的更多信息
否则,应该让springwebflux处理管道,并将第一个函数的返回值封装在mono中。完成后,您应该能够使用zip运算符: