我有一个流 randStream
,它每半秒发出一次随机值,还有一个 boolStream
,它将值从 randStream
转换为 bool 值。
let randStream = Kefir.fromPoll(500, () => Math.random())
let boolStream = Kefir.map((rand) => rand > 0.5)
我想在 boolStream
发出 true
5 秒(连续)时发出 true
。否则 emit
为假。
我正在使用 Kefir.js图书馆。
你有什么想法吗?谢谢。
最佳答案
在给定条件下,当您知道 randStream
发出数字的确切速率时,使用 .slidingWindow
很容易实现:
let result = boolStream
.slidingWindow(10, 10)
.map(items => _.every(items))
.skipDuplicates();
如果您希望它适用于任何事件速率,您可以尝试类似的方法:
let result = boolStream
.scan(({mostRecentFalse, latestValue}, bool) => {
return bool ?
{mostRecentFalse, latestValue: true} :
{mostRecentFalse: Date.now(), lastValue: false}
}, {mostRecentFalse: Date.now()})
.changes()
.map(({mostRecentFalse, latestValue}) =>
latestValue && (Date.now() - mostRecentFalse > 5000))
.skipDuplicates();
关于javascript - 响应式编程 - 值大于 X 达 N 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30185725/