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:
-
async: Je to builder funkcia (CoroutineScope extension function), ktorá spúšťa novú korutinu paralelne a vracia odloženú hodnotu typuDeferred<T>.Deferred<T>je akýsi "budúci" výsledok výpočtov, ktorý ešte nie je pripravený. Spustenie kódu po volaníasyncpokrač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" } -
await: Je to suspend funkcia, ktorá sa volá na objekteDeferred<T>. Pozastavuje vykonávanie aktuálnej korutiny až do dokončenia asynchrónnej operácie spustenej pomocouasynca získania výsledku.awaitvráti hotovú hodnotu typuT.// 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/awaitzaložené na korutinách.asyncvytvára novú korutinu, zatiaľ čoawaitpozastavuje 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.Deferreddedí odJob, čo umožňuje riadiť životný cyklus asynchrónnej operácie (zrušiť, kontrolovať stav).- Neblokujúce:
awaitneblokuje 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 ajlaunch(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 objektuDeferreda 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í.