Запросы Zip сети через Kotlin Coroutine Flow - PullRequest
1 голос
/ 17 июня 2019

У меня есть код, который передает два сетевых запроса через RxJava:

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

это означает, что repository.requestDate() / repository.requestTime() возвращает Single<T>

Если я хочу использовать сопрограммы, мне нужно изменить запросы на:

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

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

Но, Как я могу отправить запросы через Flow от Kotlin Coroutines?

Я знаю, что могу сделать это так:

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

Но я хочу сделать это через Flow!

Я знаю о каналах, но Channels.zip() устарела.

1 Ответ

0 голосов
/ 17 июня 2019

Для большинства операций Flow следует тем же правилам, что и обычные сопрограммы, поэтому для сжатия двух отдельных запросов необходимо применить асинхронный шаблон параллелизма .

На практике это будетв конечном итоге выглядит так:

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