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

问题描述 投票:1回答:2

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

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

rxjs observable
2个回答
0
投票

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

  1. 请注意,我多次使用randomIntGenerator,这将是您的异步​​项目列表。
  2. 您可以操纵适合您的上下文的predicatei > 5
  3. BehaviorSubject的状态用于确保bufferToggle()只允许随时跟踪一个缓冲流。

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


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

© www.soinside.com 2019 - 2024. All rights reserved.