首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流先等待,然后在后台处理其余部分。

流先等待,然后在后台处理其余部分。
EN

Stack Overflow用户
提问于 2020-08-27 08:03:42
回答 1查看 2.3K关注 0票数 1

我有一些东西在流动。我必须尽快编写返回第一项的函数,然后对该函数的所有调用都返回流的最新值。

代码语言:javascript
复制
val f = flow {
    emit(1)
    delay(100)
    emit(2)
}

suspend fun getLatest() = f.conflate().first() // this should be fixed, something like latest()

suspend fun main() {
    println(getLatest())
    delay(100)
    println(getLatest())
    delay(100)
    println(getLatest())
    delay(100)
    println(getLatest())
}

一开始输出应该是1,过了一些时候,总是两次输出。上面的代码总是返回的,我不明白为什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-27 09:36:41

因为Flow是冷流。每次你打电话给first(),阻止

代码语言:javascript
复制
    emit(1)
    delay(100)
    emit(2)

会再次被召唤。

将来,SharedFlow将被添加到库中,请参阅拉请求,我们可以这样编写:

代码语言:javascript
复制
val f = flow {
    emit(1)
    delay(100)
    emit(2)
}

val coroutineScope: CoroutineScope = ...
val shared = f.conflate().shareIn(
        coroutineScope,
        replay = 1,
        started = SharingStarted.WhileSubscribed()
)

suspend fun getLatest() = shared.first() // this should be fixed, something like latest()

suspend fun main() {
    println(getLatest())
    delay(100)
    println(getLatest())
    delay(100)
    println(getLatest())
    delay(100)
    println(getLatest())
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63611674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档