You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:27:17