You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从高频更新的Flow中按固定延迟发送最新值?

解决方案:使用Flow的sample操作符

直接用sample操作符就能满足你的需求——它会按照指定的时间间隔,定期采集原Flow的最新值并发射,完全匹配你要的「每300ms发送原Flow最新值」的逻辑。

实现代码

// 高频更新的Flow(每50ms更新)
val orientationFlow = merge(_orientationFlow, locationFlow)

// 每300ms发送一次原Flow的最新值
val cameraBearingFlow = orientationFlow.sample(300)

为什么之前的方案不适用

  • debounce:这个操作符的逻辑是「等待指定时长内没有新值产生,才发射最后一个值」。你的原Flow每50ms就更新一次,永远触发不了300ms的静默期,所以完全不会发射任何值,不符合需求。
  • onEach + delay:这种写法会给每个原Flow的值都加上300ms延迟,导致最终发射的是300ms前的旧值,而不是当前时刻的最新值,也不符合要求。

自定义实现(如果sample无法满足特殊需求)

如果需要更灵活的控制,可以结合stateIn和flow { ... }手动实现:

val orientationStateFlow = orientationFlow.stateIn(
    scope = yourCoroutineScope,
    started = SharingStarted.WhileSubscribed(),
    initialValue = initialOrientationValue // 替换成你的初始值
)

val cameraBearingFlow = flow {
    while (true) {
        delay(300)
        emit(orientationStateFlow.value)
    }
}

这个写法是先把原Flow转成StateFlow保存最新值,然后每隔300ms读取并发射最新值,效果和sample一致,但适合需要额外逻辑的场景。

内容的提问来源于stack exchange,提问作者SoulReaver313

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:02:08