Size: a a a

2020 February 25

U

Unat in Kotlin JVM
Danil Yudov
invokeOnCompletion
Это у джобы?
источник

D

Danil Yudov in Kotlin JVM
и у джобы, и у deferred тоже, кажется
источник

U

Unat in Kotlin JVM
Viacheslav Blinov
тогда вам 100% нужен suspendCancellableCoroutine
вот тоже склоняюсь к тому, что это менее "нецелевое" использование, чем while(true)
источник

AM

Andrew Mikhaylov in Kotlin JVM
Если чистить ресурсы необязательно синхронизированно с другим кодом, то можно одним invokeOnCompletion перебиться, без синхронизации Deferred-ом.
источник

VB

Viacheslav Blinov in Kotlin JVM
Unat
вот тоже склоняюсь к тому, что это менее "нецелевое" использование, чем while(true)
не просто менее целевое, оно для того и сделанно чтобы корутины бриджить с коллбеками и уметь за собой подчищать стейт
источник

VP

Vladimir Petrakovich in Kotlin JVM
invokeOnCompletion - довольно опасная штука
источник

AM

Andrew Mikhaylov in Kotlin JVM
Vladimir Petrakovich
invokeOnCompletion - довольно опасная штука
По-моему, вполне подходящий юзкейс, нет?
источник

AO

Alexey Otts in Kotlin JVM
Мне вот всё интересно, для чего было придумывать две абстракции Job и Deferred, почему бы Job не выразить через второе, типо Deferred<Unit>
источник

D

Danil Yudov in Kotlin JVM
Vladimir Petrakovich
invokeOnCompletion - довольно опасная штука
а что с ним не так?
источник

VB

Viacheslav Blinov in Kotlin JVM
Unat
вот тоже склоняюсь к тому, что это менее "нецелевое" использование, чем while(true)
источник

VP

Vladimir Petrakovich in Kotlin JVM
Andrew Mikhaylov
По-моему, вполне подходящий юзкейс, нет?
По мне так там или try-finally, или suspendCancellableCoroutine, если это адаптер для API с коллбеками
источник

AM

Andrew Mikhaylov in Kotlin JVM
Alexey Otts
Мне вот всё интересно, для чего было придумывать две абстракции Job и Deferred, почему бы Job не выразить через второе, типо Deferred<Unit>
Deferred об отложенном результате, Job о жизненном цикле корутины.
источник

U

Unat in Kotlin JVM
Andrew Mikhaylov
Если чистить ресурсы необязательно синхронизированно с другим кодом, то можно одним invokeOnCompletion перебиться, без синхронизации Deferred-ом.
Сложность в том, что с этим "сервисом" работает не одна джоба, а вешать такой колбек на корневую мне не нравится - в области видимости "корневой" джобы нету ссылок на "сервис".
источник

AO

Alexey Otts in Kotlin JVM
Andrew Mikhaylov
Deferred об отложенном результате, Job о жизненном цикле корутины.
Ну вот смотри, async возвращает Deferred, а launch - Job. Почему не Deferred<Unit>
источник

U

Unat in Kotlin JVM
Идеально в момент инициализации сервиса просто повесить вотчер, который убьет его как помрёт скоуп.
источник

U

Unat in Kotlin JVM
Возьму, пожалуй, suspendCancellable, оно подходит. Спасибо.
источник

VP

Vladimir Petrakovich in Kotlin JVM
Alexey Otts
Ну вот смотри, async возвращает Deferred, а launch - Job. Почему не Deferred<Unit>
Потому что async работает немного иначе в плане обработки ошибок
источник

AM

Andrew Mikhaylov in Kotlin JVM
Alexey Otts
Ну вот смотри, async возвращает Deferred, а launch - Job. Почему не Deferred<Unit>
Потому что launch вообще результат или исключение не возвращает, даже отложенно? Не знаю, не берусь утверждать, но не звучит логично.
источник

U

Unat in Kotlin JVM
Ха!
try {
 suspendCoroutine<Nothing>{}
} finally {
 UglySingletoneLibraryService.destroy()
}
источник

U

Unat in Kotlin JVM
блок внутри try ведь не завершится, пока не сдохнет весь скоуп?
источник