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()
は非推奨です。
ほとんどの操作では、Flow
は通常のコルーチンと同じルールに従います。そのため、2つの個別のリクエストをZipするには、 非同期同時実行パターン を適用する必要があります。
実際には、これは次のようになります。
flow {
emit(coroutineScope/withContext(SomeDispatcher) {
val date = async { repository.requestDate() }
val time = async { repository.requestTime() }
Result(date.await(), time.await())
}}
}