suspend fun fetchTwoDocs() = // called on any Dispatcher (any thread, possibly Main) coroutineScope {val deferreds = listOf(// fetch two docs at the same time async {fetchDoc(1)}, // async returns a result for the first doc async {fetchDoc(2)} // async returns a result for the second doc) deferreds.awaitAll() // use awaitAll to wait for both network requests} Even though fetchTwoDocs() launches new coroutines with async, the function uses awaitAll() to wait for those launched coroutines to finish before returning. Note, however, that even if we had not called awaitAll(), the coroutineScope builder does not resume the coroutine that called fetchTwoDocs until after all of the new coroutines completed.