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()`