我想创建一个特定时间段内出现的项目列表。当第一个项目出现时,我想启动计时器,并且,直到计时器完成,任何进一步的项目必须添加到同一个列表。计时器时间完成后,需要获取此总列表。在此之后,又来了另一个项目,它必须以新列表开始。
我如何在RxJS中执行此操作?
答案 0 :(得分:0)
如果我理解正确,您可以使用bufferToggle()
和BehaviorSubject
。
请注意,我对randomIntGenerator
进行了多次传输,这将是您的异步项目列表。
您可以操纵适合您的情境的谓词i > 5
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
答案 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秒钟,然后作为数组返回。
当下一个号码到达时,该过程会在一秒后再次开始