Deferred

Объект Deferred в Kotlin используется для представления отложенного значения из асинхронной операции. Он представляет собой обещание (promise) получить результат операции в будущем. Основное назначение объекта Deferred - это предоставить доступ к результату выполнения корутины.

Асинхронные вычисления с возвратом значения

Когда вы хотите запустить асинхронную операцию и получить результат, объект Deferred приходит на помощь. Вы можете использовать функцию async для запуска асинхронной операции и получить объект Deferred, который представляет результат выполнения этой операции.

fun main() {
    val deferred: Deferred<String> = GlobalScope.async {
        delay(1000) // Имитация долгой операции
        "Результат операции"
    }

    // Вы можете делать другие вещи здесь в то время, как операция выполняется асинхронно

    runBlocking {
        val result = deferred.await()
        println("Результат операции: $result")
    }
}

Композиция асинхронных операций:

Объект Deferred позволяет вам создавать композиции асинхронных операций, когда результат одной операции используется в другой.

fun main() {
    val deferred1: Deferred<Int> = GlobalScope.async {
        delay(1000)
        42
    }

    val deferred2: Deferred<String> = GlobalScope.async {
        delay(500)
        "The answer is ${deferred1.await()}"
    }

    runBlocking {
        val result = deferred2.await()
        println(result)
    }
}

Отмена операции

Объект Deferred предоставляет метод cancel(), который можно использовать для отмены выполнения асинхронной операции. Однако, отмена операции не приводит к отмене самой корутины.

fun main() {
    val deferred: Deferred<String> = GlobalScope.async {
        try {
            delay(3000)
            "Результат операции"
        } catch (e: CancellationException) {
            "Операция отменена"
        }
    }

    runBlocking {
        delay(1000)
        deferred.cancel()
        val result = deferred.await()
        println("Результат операции: $result")
    }
}