Как немедленно отменить (вернуться из) сопрограмму Kotlin изнутри области действия? - PullRequest
0 голосов
/ 20 февраля 2020

В следующем коде я хочу остановить выполнение этой области при обнаружении исключения.

GlobalScope.launch() {
   try {
       someFunctionThatThrows()
   } catch (exception: Exception) {
       // log
       cancel() // this is not stopping the coroutine and moreWork() is still executed
   }
   moreWork()
}

cancel() не отменяет сопрограмму немедленно, а вместо этого устанавливает флаг isActive в значение false , что требует последующей проверки.

1 Ответ

1 голос
/ 20 февраля 2020

Существует специальный синтаксис return@launch, return@async et c. в зависимости от того, какую область вы запустили,

GlobalScope.launch() {
   try {
       someFunctionThatThrows()
   } catch (exception: Exception) {
       // log
       return@launch 
   }
   moreWork()
}

return@async может также иметь фактическое возвращаемое значение, которое передается в его Deferred<T> val.

val deferredValue = GlobalScope.async() { return@aysnc "hello world" }

...