我有这样的功能
fun getUsersList(userIds: List<String>): List<User> {
val list = mutableListOf<User>()
userIds.forEach { id ->
getUserFromDatabase(id) { user ->
list.add(user)
}
}
return list
}
当然,在这种情况下,方法返回空列表,因为它return list
在循环中的异步任务完成之前调用。
那么如何让它等到循环完成后再返回呢?
我学习了协程基础知识,但仍然不知道如何处理这个问题,这就是为什么我使用回调来更新 viewModel。
UPD:为了澄清我的情况,我(例如)List<Type1>
从数据库获取,然后从此列表获取userId
,然后User
从数据库获取。我需要构建 Map<Type1,User> 并将其放入 viewModel 中。为此我使用:
list<Type1>.forEach { type1 ->
getUserFromDatabase(type1.userId) { user ->
map.put(type1, user)
}
}
其实问题是关于返回结果而不是回调,我得到了答案。接下来我会自己处理。谢谢大家。
构建一个
List<Deferred<User>>
,然后调用awaitAll()
它以获取结果List<User>
。所有这些都必须在一个中发生CoroutineScope
- 在我的示例中,它是用创建的coroutineScope
,但您可以使用withContext
或其他方式。