Sobes.tech
Junior — Middle

Эгерде анын ичинде launch бар жана исключение болсо, async аткаруу токтотулуп калабы?

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-тан чыккан катоо, `await()` чакырылбаганда, deferred-ке таасир этпейт