반응형
아래 두 코드는 다른 방식으로 동작합니다.
1) async { api호출함수() }을 여러 개 사용 후, await() 여러 개를 호출하는 코드
vs
2) async { api호출함수() }.await() 여러 개를 바로 호출하는 코드
1) async { api호출함수() }을 여러 개 사용 이후, await() 여러 개를 호출하는 코드
- getUserApi()와 getPeedApi()를 병렬로 호출하고, 각각의 작업이 완료될 때까지 대기합니다. 따라서 getUserApi()와 getPeedApi() 함수 호출은 동시에 이루어질 수 있으며, 두 작업이 완료되는 순서에 따라 데이터를 받습니다.
suspend fun fetchData() {
coroutineScope {
val userDeferred = async { getUserApi() }
val peedDeferred = async { getPeedApi() }
val user = userDeferred.await()
val peed = peedDeferred.await()
// 이후 user와 peed를 이용한 로직을 여기에 작성하실 수 있습니다.
}
}
vs
2) async { api호출함수() }.await() 여러 개를 바로 호출하는 코드
- getUserApi()와 getPeedApi()를 각각 비동기적으로 호출하지만, await 함수를 호출하여 첫 번째 작업인 getUserApi()가 완료될 때까지 대기합니다. 따라서 getUserApi() 작업이 완료된 후에 getPeedApi() 작업을 실행하게 됩니다.
suspend fun fetchData() {
coroutineScope {
val userDeferred = async { getUserApi() }.await()
val peedDeferred = async { getPeedApi() }.await()
val user = userDeferred
val peed = peedDeferred
}
}
결론
- await()를 각각의 결과에 대해 호출하면, 먼저 호출된 await()의 작업이 완료될 때까지 기다린 후 결과를 받습니다.
- 모두 코루틴을 사용하여 비동기적으로 동작하며, 동시성을 보장하지만,
1번 함수는 두 작업을 병렬로 실행하므로 순서를 보장하지 않고
2번 함수는 getUserAPI()를 기다린 후에 getPeedApi()를 호출하기 때문에 순서를 보장한다는 차이가 있어보인다.
출처
반응형