Kotlin Ленивая сопрограмма в android - PullRequest
1 голос
/ 20 января 2020

Я пытаюсь создать ленивую функцию моих сопрограмм. Я создал утилиту вот так.

fun <T> lazyCoroutine(scope: CoroutineScope, block: suspend CoroutineScope.() -> T): Lazy<T> {

    val some = scope.async(start = CoroutineStart.LAZY) {
        block.invoke(this)
    }
    return lazy {
        some.await()
    }
}

Но в терминале показывают

my error

Я тоже не хочу чтобы вернуть Deferred<T>, я только хочу вернуться только из deferred. Я видел, что большая часть статьи возвращает Deferred<T>, что не подходит для моего сценария. Есть ли какое-либо соответствующее решение, пожалуйста, укажите мне. Удачного дня!.

myscenario

1 Ответ

3 голосов
/ 20 января 2020

Я видел, что большая часть статьи возвращает Deferred<T>, что не подходит для моего сценария.

Вы не дали понять, что именно не подходит для Deferred, но если сам факт того, что await() является приостановленной функцией, то, кажется, вы запрашиваете противоречивые результаты: вы хотите, чтобы пользователь вызывал неподдерживаемую функцию, а реализация использовала приостановленную, и вы ожидаете, что Общий результат должен быть неблокирующим. Никакие обертки или адаптации не позволят вам избежать блокирования извне приостановленного домена.

Если вы хотите остаться с простой, не приостанавливаемой функцией, то вообще не используйте сопрограммы, они будут просто еще один уровень сложности, и ваш поток будет блокироваться до тех пор, пока значение не станет доступным.

Если у вас все в порядке с функцией приостановки, тогда вы должны принять Deferred:

fun <T> CoroutineScope.lazyCoroutine(
        block: suspend CoroutineScope.() -> T
): Deferred<T> {
    return async(start = CoroutineStart.LAZY) { block() }
}
...