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

如何在viewModelScope中等待两个挂起函数的异步返回值

Kotlin协程并行执行挂起函数并等待结果

要让fetchName和fetchSurname并行执行并等待两者结果,核心是用Kotlin协程的async函数——它能启动独立协程并行处理任务,返回的Deferred对象可通过await()方法获取最终结果。

修改后的完整代码

viewModelScope.launch(exceptionHandler) {
    // 并行启动两个挂起任务
    val nameDeferred = async { fetchName() }
    val surnameDeferred = async { fetchSurname() }

    // 等待两个任务全部完成,获取返回值
    val name = nameDeferred.await()
    val surname = surnameDeferred.await()

    // 此处可使用name和surname执行后续逻辑
    processNameAndSurname(name, surname)
}

private suspend fun fetchName(): Name {
    return withContext(Dispatchers.IO) {
        // 数据库操作逻辑
    }
}

private suspend fun fetchSurname(): Surname {
    return withContext(Dispatchers.IO) {
        // 数据库操作逻辑
    }
}

// 示例后续处理函数
private fun processNameAndSurname(name: Name, surname: Surname) {
    // 业务处理代码
}

关键说明

  1. 移除多余的外层withContext(Dispatchers.IO):你的两个挂起函数内部已经通过withContext(Dispatchers.IO)切换到IO线程,外层再包裹会强制任务顺序执行,完全没必要保留。
  2. async启动并行任务:调用async后,两个挂起函数会立刻同时执行,而非等待前一个完成才启动后一个。
  3. await()等待结果:调用await()时,协程会暂停,直到对应任务完成并返回结果;两个await()会等待所有并行任务都结束后,才继续执行后续代码。
  4. 异常处理:由于async是viewModelScope的子协程,其抛出的异常会被你传入的exceptionHandler统一处理,无需额外单独捕获。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:43:14