web-dev-qa-db-ja.com

Kotlinコルーチンフローを介したZipネットワークリクエスト

RxJavaを介して2つのネットワーク要求を圧縮するコードがあります。

_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

_

しかし、Kotlinコルーチンからのフローを介してリクエストをZipするにはどうすればよいですか?

私はこのようにそれを行うことができることを知っています:

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

しかし、Flowでやりたい!

チャネルについては知っていますが、Channels.Zip()は非推奨です。

6
elvisfromsouth

ほとんどの操作では、Flowは通常のコルーチンと同じルールに従います。そのため、2つの個別のリクエストをZipするには、 非同期同時実行パターン を適用する必要があります。

実際には、これは次のようになります。

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