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

如何批量调用API获取所有账户详情并通知观察者任务完成?

解决方案

实现步骤

  1. 获取账户列表后,遍历每个账户调用详情接口
  2. 统一处理所有详情请求的结果,筛选成功的详情生成目标列表
  3. 操作完成后通过观察者模式(如LiveData/Flow)通知UI

修改后的代码示例

viewModelScope.launch {
    gateway.getAccounts().fold(
        onSuccess = { accountList ->
            val accountDetailsList = mutableListOf<LOCAccount>()
            
            // 方式1:串行执行(按顺序逐个请求)
            accountList.forEach { accountInfo ->
                gateway.getCreditAccountDetails(accountInfo.accountId, accountInfo.accountIdType).fold(
                    onSuccess = { details -> accountDetailsList.add(details) },
                    onFailure = { error -> 
                        // 处理单个详情请求失败,比如记录日志
                        Log.e("AccountDetails", "获取账户${accountInfo.accountId}详情失败", error)
                    }
                )
            }

            // 方式2:并行执行(同时发起所有请求,效率更高)
            // val deferredList = accountList.map { accountInfo ->
            //     async {
            //         gateway.getCreditAccountDetails(accountInfo.accountId, accountInfo.accountIdType)
            //     }
            // }
            // deferredList.awaitAll().forEach { result ->
            //     result.fold(
            //         onSuccess = { details -> accountDetailsList.add(details) },
            //         onFailure = { error -> Log.e("AccountDetails", "获取详情失败", error) }
            //     )
            // }

            // 生成列表后通知观察者
            _accountDetailsLiveData.value = accountDetailsList
            // 若使用Flow:_accountDetailsFlow.emit(accountDetailsList)
        },
        onFailure = { error ->
            // 处理账户列表获取失败的情况
            Log.e("Accounts", "获取账户列表失败", error)
            _accountDetailsLiveData.value = emptyList()
        }
    )
}

核心细节说明

  • 全量遍历处理:用forEach(串行)或async+awaitAll(并行)替代原代码的first(),确保每个账户都触发详情请求
  • 结果与错误处理:每个详情请求的Result单独处理,成功结果加入目标列表,失败可按需记录日志或降级处理
  • 观察者通知:通过ViewModel的LiveData(或StateFlow)更新数据,UI层观察该数据即可收到完成通知

协程函数(中文翻译版)

// 获取账户列表的协程函数
suspend fun getAccounts(): Result<List<LOCAccountInfo>> {
    return withContext(Dispatchers.IO) {
        AccountServicing.getCreditAccounts(creditAuthClient)
    }
}

// 获取单个账户详情的协程函数
suspend fun getCreditAccountDetails(accountId: AccountId, accountIdType: AccountIdType): Result<LOCAccount> {
    return getCreditAccountDetails(accountId, accountIdType, creditAuthClient)
}

内容的提问来源于stack exchange,提问作者andrewedgar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:31:01