Sobes.tech
Junior — Middle

Կարող է արդյոք async-ի կատարմանը չեղարկել, եթե դրա ներսում կա launch և տեղի ունենա արտահայտություն?

sobes.tech AI

Պատասխան AI-ից

Kotlin Coroutines-ներում, եթե async բլոկի ներսում launch միջոցով coroutine է սկսվում, ապա launch-ում առաջացած արտահայտությունը ավտոմատ կերպով չի կասեցնի async-ի կատարմանը:

Սա այն պատճառով է, որ async և launch ստեղծում են տարբեր coroutine-ներ, որոնք ունեն տարբեր սխալի կառավարում մեխանիզմներ:

  • async վերադարձնում է Deferred, և դրա ներսում գտնվող սխալները փոխանցվում են await()-ի ժամանակ:
  • launch սկսում է coroutine, որը չի վերադարձնում արդյունք, և դրա մեջ գտնվող արտահայտությունները կառավարվում են CoroutineExceptionHandler-ով կամ հանգեցնում են ծնողական coroutine- ի չեղարկման:

Եթե launch-ը սկսվում է async-ի ներսում առանց նրա Job-ի հստակ կապի, ապա launch-ի մեջ սխալը չի կասեցնի async-ի կատարմանը: Անհրաժեշտ է launch-ը սկսել նույն CoroutineScope-ում կամ օգտագործել SupervisorJob, կամ հստակորեն կառավարել սխալները:

Օրինակ՝

val deferred = async {
    launch {
        throw Exception("Սխալ `launch`-ում")
    }
    // async- ի կատարմանը շարունակվում է
}

// `launch`-ից սխալը չի ազդի `deferred`-ի վրա, մինչև չկոչվի `await()`