Sobes.tech
Junior — Middle

Оё иҷрои async бекор карда мешавад, агар дар дохили он launch бошад ва хатогӣ рӯ диҳад?

sobes.tech AI

Ҷавоб аз AI

Дар Kotlin Coroutines, агар дар дохили блоки async як coroutine тавассути launch оғоз карда шавад, хатое, ки дар 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` таъсир намерасонад