【问题标题】:Kotlin Lazy Coroutine in androidandroid中的Kotlin Lazy Coroutine
【发布时间】:2020-05-06 06:14:49
【问题描述】:

我正在尝试为我的协程创建惰性函数。我创建了这样的 util 函数。

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()
    }
}

但是在终端显示

我也不想返回Deferred&lt;T&gt;,我只想从deferred返回。我看到大部分文章都返回Deferred&lt;T&gt;,这不适合我的场景。有没有相关的解决方案请指出。祝你有美好的一天!。

【问题讨论】:

    标签: android android-architecture-components kotlin-coroutines


    【解决方案1】:

    我看到大部分文章都返回Deferred&lt;T&gt;,这不适合我的场景。

    您还没有明确说明 Deferred 到底哪里不合适,但如果 await() 是一个可暂停的函数,那么您似乎要求的是自相矛盾的结果:您希望用户调用非挂起函数,但实现使用可挂起函数,并且您期望整体结果是非阻塞的。再多的包装或改编都无法避免来自可暂停域之外的阻塞。

    如果你想保留一个普通的、不可暂停的函数,那么就不要使用协程,它们只是又一层复杂性,你的线程仍然会阻塞,直到值可用。

    如果你对一个可挂起函数没问题,那么你应该接受Deferred

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

    【讨论】:

      猜你喜欢
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 2021-03-28
      • 2019-11-10
      相关资源
      最近更新 更多