Я видел, что большая часть статьи возвращает Deferred<T>
, что не подходит для моего сценария.
Вы не дали понять, что именно не подходит для Deferred
, но если сам факт того, что await()
является приостановленной функцией, то, кажется, вы запрашиваете противоречивые результаты: вы хотите, чтобы пользователь вызывал неподдерживаемую функцию, а реализация использовала приостановленную, и вы ожидаете, что Общий результат должен быть неблокирующим. Никакие обертки или адаптации не позволят вам избежать блокирования извне приостановленного домена.
Если вы хотите остаться с простой, не приостанавливаемой функцией, то вообще не используйте сопрограммы, они будут просто еще один уровень сложности, и ваш поток будет блокироваться до тех пор, пока значение не станет доступным.
Если у вас все в порядке с функцией приостановки, тогда вы должны принять Deferred
:
fun <T> CoroutineScope.lazyCoroutine(
block: suspend CoroutineScope.() -> T
): Deferred<T> {
return async(start = CoroutineStart.LAZY) { block() }
}