反应式编程 - N秒内的值大于X.

use*_*183 7 javascript reactive-programming

我有一个流randStream,每半秒发出一次随机值boolStream,并将值转换randStream为布尔值.

let randStream = Kefir.fromPoll(500, () => Math.random())
let boolStream = Kefir.map((rand) => rand > 0.5)
Run Code Online (Sandbox Code Playgroud)

我想trueboolStream发射true5秒(连续)时发射.否则是emit假的.

我正在使用Kefir.js库.

你有什么想法?谢谢.

Rom*_*nov 1

在给定的条件下,当您知道randStream发出数字的确切速率时,可以很容易地通过以下方式实现.slidingWindow

let result = boolStream
  .slidingWindow(10, 10)
  .map(items => _.every(items))
  .skipDuplicates();
Run Code Online (Sandbox Code Playgroud)

如果您希望它能够处理任何发生率的事件,您可以尝试以下操作:

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();
Run Code Online (Sandbox Code Playgroud)