创建计时器(如果尚未提供) - RXJS

时间:2017-12-19 04:40:00

标签: rxjs observable

我想创建一个特定时间段内出现的项目列表。当第一个项目出现时,我想启动计时器,并且,直到计时器完成,任何进一步的项目必须添加到同一个列表。计时器时间完成后,需要获取此总列表。在此之后,又来了另一个项目,它必须以新列表开始。

我如何在RxJS中执行此操作?

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您可以使用bufferToggle()BehaviorSubject

  1. 请注意,我对randomIntGenerator进行了多次传输,这将是您的异步​​项目列表。

  2. 您可以操纵适合您的情境的谓词i > 5

  3. BehaviorSubject的状态用于确保bufferToggle()只允许随时跟踪一个缓冲流。

  4. var Rx = require('rxjs');
    
    let tap = new Rx.BehaviorSubject(false);
    tap.subscribe(i=>console.log(`tap...${(i? 'on' : 'off')}`))
    
    let randomIntGenerator = Rx.Observable
                               .interval(1000)
                               .map( ()=>getRandomInt(1 , 10) )
                               .share()
    
    randomIntGenerator
      .do(i=>console.log('emits: ', i))
      .bufferToggle(
          randomIntGenerator,
          (i)=>{
            if(i>5 && !tap.value){
              tap.next(true)
              return Rx.Observable.interval(3000)
            }
          }
        )
      .do(()=>tap.next(false) )
      .subscribe( list=>console.log('#newlist -->', list) )
    
    function getRandomInt (min, max){
        //From MDN's Math,random() example
        min = Math.ceil(min);  
        max = Math.floor(max);
        return Math.floor(Math.random() * (max - min)) + min;
      }
    

    查看实时实施here

答案 1 :(得分:0)

此代码将为您完成:

console.clear()

const getRandom = () => {
  return Math.round(Math.random()*300,0)
}

const timer$ = Rx.Observable.interval(1000)   // A stream of numbers
.map(getRandom)
// .do(console.log) // uncomment to see each number as it is generated
.bufferTime(5000)

const s = timer$.subscribe(val => console.log( val));

这个使用计时器和随机数发生器来提供一系列随机数。它们被缓冲5秒钟,然后作为数组返回。

当下一个号码到达时,该过程会在一秒后再次开始

codepen在这里https://codepen.io/mikkel/pen/VyzEgb?editors=1001