Ant*_*nit 5 kotlin kotlin-coroutines
如何并行运行多个协程并仅返回最先完成的协程的值?
在现实生活中,我有两个数据源- 数据库和API服务。我不在乎数据从哪里来,我只需要快速。完成查询后,如何查询数据库和API服务并取消另一个请求?
在RxJava世界中,这等于Amb运算符。如何使用协程实现类似的行为?
我想出了以下实现:
suspend fun getFaster(): Int = coroutineScope {
select<Int> {
async { getFromServer() }.onAwait { it }
async { getFromDB() }.onAwait { it }
}.also {
coroutineContext.cancelChildren()
}
}
Run Code Online (Sandbox Code Playgroud)
在coroutineScope充当父中执行的所有异步调用。完成后,select我们可以取消其余的。
您可以使用select编写自己的amb运算符。像这样的东西:
suspend fun <T> amb(vararg jobs: Deferred<T>): T = select {
fun cancelAll() = jobs.forEach { it.cancel() }
for (deferred in jobs) {
deferred.onAwait {
cancelAll()
it
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在此处select阅读有关表达的更多信息
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |