如何使用Mutiny(Uni)实现API响应的链式调用
响应式REST客户端函数链式调用与对象构造
你有三个响应式REST客户端函数:
getOne(): Uni<String>:返回单个字符串的异步结果getTwo(responseFromOne: String): Uni<List<Two>>:接收getOne的输出作为参数,返回Two类型列表的异步结果getThree(responsesFromTwo: List<Two>): Uni<List<Three>>:接收getTwo的输出作为参数,返回Three类型列表的异步结果
你想要把这三个函数链式调用,依次传递参数,最终在所有调用完成后构造SomeObject对象。但你提供的伪代码存在问题——最后的map操作里没法直接拿到getTwo的结果,因为链式到getThree之后,上下文里只剩getThree的返回值了。
下面是正确的实现方式,通过嵌套操作保留所需的上下文结果:
val someObjects: Uni<SomeObject> = getOne() // 先调用getTwo,传递getOne的结果 .onItem().transformToUni { oneResult -> getTwo(oneResult) // 再调用getThree,传递getTwo的结果,同时保留getTwo的返回值 .onItem().transformToUni { twoResults -> getThree(twoResults) // 此时同时拥有twoResults和threeResults,用来构造目标对象 .map { threeResults -> SomeObject(twoResults.something, threeResults.something) } } }
或者用更简洁的写法(flatMap和transformToUni在Uni中功能类似):
val someObjects: Uni<SomeObject> = getOne() .flatMap { getTwo(it) } .flatMap { twoList -> getThree(twoList).map { threeList -> SomeObject(twoList.something, threeList.something) } }
核心思路是在调用getThree的过程中,保留住getTwo返回的结果,这样在最终构造SomeObject时就能同时使用两个步骤的输出。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

