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