如何批量调用API获取所有账户详情并通知观察者任务完成?
解决方案
实现步骤
- 获取账户列表后,遍历每个账户调用详情接口
- 统一处理所有详情请求的结果,筛选成功的详情生成目标列表
- 操作完成后通过观察者模式(如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
相关产品推荐
相关产品推荐

