web-dev-qa-db-fra.com

Demandes de réseau Zip via Kotlin Coroutine Flow

J'ai un code qui zippe deux requêtes réseau via RxJava:

Single.Zip(repository.requestDate(), repository.requestTime()) {
  date, time -> Result(date, time)
}

cela signifie que repository.requestDate()/repository.requestTime() renvoie Single<T>

Si je veux utiliser Coroutines, je dois changer les demandes en:

@GET('link/date')
suspend fun requestDate() : Date

@GET('link/time')
suspend fun requestTime() : Time

Mais, Comment puis-je compresser les demandes via Flow depuis Kotlin Coroutines?

Je sais que je peux le faire comme ceci:

coroutineScope {
   val date = repository.requestDate()
   val time = repository.requestTime()
   Result(date, time)
}

Mais je veux le faire via Flow!

Je connais les canaux, mais Channels.Zip() est obsolète.

6
elvisfromsouth

Pour la plupart des opérations, Flow suit les mêmes règles que les co-routines normales, donc pour compresser deux requêtes distinctes, vous devez appliquer modèle de concurrence asynchrone .

En pratique, cela finira par ressembler à ceci:

flow {
    emit(coroutineScope/withContext(SomeDispatcher) {
        val date = async { repository.requestDate() }
        val time = async { repository.requestTime() }
        Result(date.await(), time.await())
    }}
}
2
Kiskae