Функция coroutineScope
Функция coroutineScope создает новую область видимости для корутин, наследуя контекст от родительской корутины.
Является suspend-функцией и приостанавливает выполнение до тех пор, пока не завершатся все дочерние корутины внутри блока.
Если какая-либо дочерняя корутина завершается с ошибкой, то все остальные дочерние корутины отменяются, а исключение пробрасывается наружу.
Импорт
import kotlinx.coroutines.coroutineScope
Синтаксис
suspend fun <R> coroutineScope(
block: suspend CoroutineScope.() -> R
): R
Пример
Базовое использование coroutineScope для запуска дочерних корутин:
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
coroutineScope {
launch {
delay(1000)
println("Child coroutine 1")
}
launch {
delay(500)
println("Child coroutine 2")
}
println("Parent coroutine")
}
println("All coroutines completed")
}
Результат выполнения кода:
Parent coroutine
Child coroutine 2
Child coroutine 1
All coroutines completed
Пример
Возврат значения из coroutineScope:
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
val result = coroutineScope {
delay(1000)
"Result from coroutine scope"
}
println("Result: $result")
}
Результат выполнения кода:
Result: Result from coroutine scope
Пример
Обработка исключений в coroutineScope:
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
try {
coroutineScope {
launch {
delay(500)
throw RuntimeException("Error in child coroutine")
}
launch {
delay(1000)
println("This won't be printed")
}
}
} catch (e: Exception) {
println("Caught exception: ${e.message}")
}
}
Результат выполнения кода:
Caught exception: Error in child coroutine
Пример
Параллельное выполнение операций в coroutineScope:
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
val result = coroutineScope {
val deferred1 = async {
delay(1000)
"Hello"
}
val deferred2 = async {
delay(500)
"World"
}
"${deferred1.await()} ${deferred2.await()}"
}
println(result)
}
Результат выполнения кода:
Hello World
Смотрите также
-
функцию
withContext,
которая переключает контекст выполнения корутины -
функцию
runBlocking,
которая создает блокирующий контекст для корутин -
функцию
async,
которая запускает асинхронную операцию с возвратом результата