Abhimanyu
05/12/2024, 4:26 PMprivate suspend fun getData(): MyData {
return coroutineScope {
val data1 = async(
context = dispatcherProvider.io,
) {
getData1UseCase()
}
val data2 = async(
context = dispatcherProvider.io,
) {
getData2UseCase()
}
val data3 = async(
context = dispatcherProvider.io,
) {
getData3UseCase()
}
MyData(
data1 = data1.await(),
data2 = data2.await(),
data3 = data3.await(),
)
}
}Abhimanyu
05/12/2024, 4:27 PMgetData1UseCase() -> Returns a list of Data1 type.
getData2UseCase() -> Returns a list of Data2 type.
getData3UseCase() -> Returns a list of Data3 type.
I want to fetch all the data in parallel.
So, using async for each use case call.kevin.cianfarini
05/12/2024, 4:29 PMkevin.cianfarini
05/12/2024, 4:34 PMsuspend fun foo() {
return withContext(<http://dispatcherProvider.io|dispatcherProvider.io>) {
val first = async { ... }
val second = async { ... }
return MyData(first.await(), second.await())
}
}Geert
05/12/2024, 8:06 PMuli
05/14/2024, 10:48 AMawaitAll to fail faster, when one of the tasks fail. awaitAll will cancel the first tasks (and all others) as soon as one of the later fail. Otherwise it’s the same:
val (data1, data2, data3) = awaitAll(
async(
context = dispatcherProvider.io,
) {
getData2UseCase()
},
async(
context = dispatcherProvider.io,
) {
getData2UseCase()
},
async(
context = dispatcherProvider.io,
) {
getData2UseCase()
}
)
MyData(data1, data2, data3)Abhimanyu
05/14/2024, 11:10 AM