android - android中的Kotlin Lazy Coroutine
问题描述
我正在尝试为我的协程创建惰性函数。我创建了这样的 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<T>
,我只想回来刚出来deferred
。我看到大部分Deferred<T>
不适合我的场景的文章返回。有没有相关的解决方案请指出。祝你有美好的一天!。
解决方案
我看到大部分
Deferred<T>
不适合我的场景的文章返回。
您还没有说清楚到底什么是不合适的Deferred
,但是如果这await()
是一个可暂停函数的事实,那么您似乎要求得到自相矛盾的结果:您希望用户调用一个不可暂停的函数,但是实现使用可暂停的,并且您希望整体结果是非阻塞的。再多的包装或调整都不会让您避免来自可暂停域之外的阻塞。
如果您想保留一个普通的、不可暂停的函数,那么根本不要使用协程,它们只是另一层复杂性,您的线程仍然会阻塞,直到值可用。
如果您可以使用可暂停功能,那么您应该接受Deferred
:
fun <T> CoroutineScope.lazyCoroutine(
block: suspend CoroutineScope.() -> T
): Deferred<T> {
return async(start = CoroutineStart.LAZY) { block() }
}
推荐阅读
- amazon-web-services - Terraform 更新 Cloudfront 分发
- php - Etag 未出现在 Laravel API 的标头中
- uicollectionview - 在 UICollectionViewController 中指定具体的单元格大小?
- shell - 将 Debian 9 (Stretch) Backports 添加到我的 sources.list
- python - Geodjango - 内存中的 r-tree 索引
- c# - 调用多个异步方法最终返回一个字符串值
- database - 使用 JS 保存和处理日期的正确结构是什么?
- json - JSON Feed 作为对象
- android - java.lang.string 无法转换为 JSONarray
- node.js - 中 sdk 的测试用例