仅返回更快协程的值

Ant*_*nit 5 kotlin kotlin-coroutines

如何并行运行多个协程并仅返回最先完成的协程的值?

在现实生活中,我有两个数据源- 数据库API服务。我不在乎数据从哪里来,我只需要快速。完成查询后,如何查询数据库API服务并取消另一个请求?

在RxJava世界中,这等于Amb运算符。如何使用协程实现类似的行为?

Ant*_*nit 7

我想出了以下实现:

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我们可以取消其余的。


And*_*ana 6

您可以使用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阅读有关表达的更多信息