如何在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) { // 业务处理代码 }
关键说明
- 移除多余的外层
withContext(Dispatchers.IO):你的两个挂起函数内部已经通过withContext(Dispatchers.IO)切换到IO线程,外层再包裹会强制任务顺序执行,完全没必要保留。 async启动并行任务:调用async后,两个挂起函数会立刻同时执行,而非等待前一个完成才启动后一个。await()等待结果:调用await()时,协程会暂停,直到对应任务完成并返回结果;两个await()会等待所有并行任务都结束后,才继续执行后续代码。- 异常处理:由于
async是viewModelScope的子协程,其抛出的异常会被你传入的exceptionHandler统一处理,无需额外单独捕获。
内容的提问来源于stack exchange,提问作者Slava
相关产品推荐
相关产品推荐

