Sobes.tech
Middle

Ako funguje konštrukcia async/await v programovacom jazyku Kotlin?

sobes.tech AI

Odpoveď od AI

V Kotlinu sa asynchrónnym programovaním sa používajú korutiny, nie async/await v bežnom zmysle, ako v C# alebo JavaScript. Avšak knižnica kotlinx.coroutines poskytuje funkcie async a await, ktoré implementujú podobný vzor založený na korutinách.

Ako to funguje:

  1. async: Je to builder funkcia (CoroutineScope extension function), ktorá spúšťa novú korutinu paralelne a vracia odloženú hodnotu typu Deferred<T>. Deferred<T> je akýsi "budúci" výsledok výpočtov, ktorý ešte nie je pripravený. Spustenie kódu po volaní async pokračuje ihneď, nečakajúc na dokončenie asynchrónnej operácie.

    // Príklad použitia async
    val deferredResult = CoroutineScope(Dispatchers.IO).async {
        // Asynchrónna operácia (napríklad požiadavka na sieť alebo čítanie súboru)
        delay(1000) // Imaginárna dlhá práca
        "Výsledok asynchrónnej operácie"
    }
    
  2. await: Je to suspend funkcia, ktorá sa volá na objekte Deferred<T>. Pozastavuje vykonávanie aktuálnej korutiny až do dokončenia asynchrónnej operácie spustenej pomocou async a získania výsledku. await vráti hotovú hodnotu typu T.

    // Príklad použitia await
    // Vo vnútri suspend funkcie alebo korutiny
    val result = deferredResult.await() // Pozastaví vykonávanie do získania výsledku
    println(result)
    

Kľúčové body:

  • Korutiny: V Kotlin-e sú async/await založené na korutinách. async vytvára novú korutinu, zatiaľ čo await pozastavuje aktuálnu korutinu bez blokovania vlákna.
  • Deferred<T>: Je to analóg Promise v JavaScript-e alebo Task<T> v C#. Predstavuje výsledok, ktorý bude dostupný v budúcnosti. Deferred dedí od Job, čo umožňuje riadiť životný cyklus asynchrónnej operácie (zrušiť, kontrolovať stav).
  • Neblokujúce: await neblokuje vlákno, v ktorom sa korutina vykonáva. Namiesto toho pozastavuje korutinu, uvoľňuje vlákno pre iné úlohy. Keď je výsledok asynchrónnej operácie pripravený, korutina pokračuje.
  • Scope: Ako async, tak aj launch (iný builder korutín) sú extension funkcie na CoroutineScope. To znamená, že musia byť spustené v určitej oblasti (Scope). Scope riadi životný cyklus korutín v ňom spustených.
  • Prenos výnimiek: Výnimky, ktoré vzniknú v korutine spustenej cez async, sa ukladajú do objektu Deferred a budú vyhodené pri volaní await.

Porovnanie s launch:

Aspekt launch async
Vrátený typ Job Deferred<T> (zdedí od Job)
Cieľ "Spusti a zabudni" (vedľajšie efekty) Získanie výsledku
Čaká na dokončenie Nie (ak nepoužiješ join()) Áno (await())
Príklad použitia Spustenie UI aktualizácie Vykonanie sieťového požiadavku a spracovanie odpovede

async a await v Kotlin umožňujú písať asynchrónny kód v sekvenčnom štýle, čím ho robia prehľadnejším a zrozumiteľnejším, pričom využívajú výhody neblokujúcich operácií.