Rxjs 每1000毫秒获取一个事件

Rxjs 每1000毫秒获取一个事件,rxjs,reactivex,Rxjs,Reactivex,我有无限的事件流,可以发出一些连续的事件部分,我希望每1000毫秒发生一个事件 我尝试了debounceTime/auditTime/throttleTime,但它们不包括我想要的所有事件-以演示我创建的行为,在10个事件中,每300ms触发一次事件: debounceTime(1000)将只提供事件35;10 throttleTime(1000)将给出事件1,5,9,但它将忽略10 这是必要的 auditTime(1000)将给出事件4,8 我想在这里得到的是事件1,5,9,10(每100

我有无限的事件流,可以发出一些连续的事件部分,我希望每1000毫秒发生一个事件

我尝试了
debounceTime
/
auditTime
/
throttleTime
,但它们不包括我想要的所有事件-以演示我创建的行为,在10个事件中,每300ms触发一次事件:

  • debounceTime(1000)
    将只提供事件35;
    10

  • throttleTime(1000)
    将给出事件
    1,5,9
    ,但它将忽略
    10
    这是必要的

  • auditTime(1000)
    将给出事件
    4,8

我想在这里得到的是事件
1,5,9,10
(每1000ms间隔一个事件)。我如何做到这一点

const events$=间隔(300)。管道(
映射(num=>`Firing event${num+1}`)
);
const source=events$.pipe(
点击(console.log),
以(10)为例,
//做一些去抖??
映射(x=>`Received${x}!`)
);
source.subscribe(x=>
console.log(
“%c”+x,
“背景:紫色;颜色:白色;填充:3px 5px;边框半径:3px;”
)

);这里有一种方法:

const events$=间隔(300)。管道(
映射(num=>`触发事件${num+1}`),
share(),
);
const source$=事件$.pipe(
以(10)为例,
);
const lastValue$=源$.pipe(last());
合并(源$.pipe(throttleTime(1000)),lastValue$).subscribe(console.log);
share()
将确保源(生成的可观察的
间隔
by)只订阅一次

由于
take(10)

编辑 根据我对问题的理解,这将是另一种选择:

const事件$=merge(
定时器(300),//1
定时器(600),//2
定时器(900),//3
定时器(1301),//4
定时器(1500),//5
定时器(1800),//6
定时器(2302),//7
).烟斗(
map((u,num)=>`Firing event${num+1}`),
share(),
);
const lastValue$=events$.pipe(debounceTime(1000));
const source$=事件$.pipe(
节流时间(1000),
缓冲区(lastValue$)
)
.subscribe(console.log)
  • debounceTime(1000)
    -如果1s在没有任何通知的情况下通过

  • buffer(lastValue$)
    -当
    lastValue$
    发出时,发送收集的值


更新

根据评论中的讨论

const events$=计时器(0,6000)。管道(
以(3)为例,
开关映射(x=>
计时器(0,300)。管道(
映射(num=>`event#${num+1}`),
采取(x>1?9:10)
)
)
);
常量源=合并(
事件$.pipe(
轻触(e=>console.log(`%cStream:${e}`,“color:blue;”),
去BounceTime(1000),
轻触(x=>console.log(`%cdebounceTime-captured:${x}`,“color:red;”)
),
事件$.pipe(
节流时间(1000),
轻触(x=>console.log(`cthrottleTime captured:${x}`,“color:green;”)
),
).烟斗(
//我们需要避免重复(如9的情况)。
//如果并非所有事件都是唯一的,则需要使用下面的原始解决方案。
distinctUntilChanged(),//`已收到${x}!`)
);
source.subscribe(x=>
console.log(
“%c”+x,
“背景:紫色;颜色:白色;填充:3px 5px;边框半径:3px;”
)
);
原创

我希望这就是你想要的:

const events$=间隔(300)。管道(
映射(num=>`Firing event${num+1}`)
);
const source=concat(事件$.pipe(
点击(console.log),
以(10)为例,
),计时器(1000).pipe(开关映射到(空)),事件$.pipe(
点击(console.log),
以(10)为例,
));
设lastTimer=0;
const last$=新主题();
合并(
源管道(
扫描((状态、事件)=>{
状态[1]=空;
const stamp=new Date().getTime();
clearTimeout(lastTimer);
如果(戳记状态[0]<1000){
lastTimer=setTimeout(()=>last$.next(事件),(戳记状态[0])+50);
返回状态;
}
状态[0]=戳记;
状态[1]=事件;
返回状态;
},[0,空],
过滤器(([,事件]=>event!==null),
映射([事件]=>事件| | 0),
),
最后一元,
).烟斗(
map(x=>`Received${JSON.stringify(x)}!`)
).订阅(x=>
console.log(
“%c”+x,
“背景:紫色;颜色:白色;填充:3px 5px;边框半径:3px;”
)
);

您能解释一下包括最后一个的意思吗?你想得到1000毫秒后的当前值和最后一个已知值吗?所以这将是一个1的历史链,对吗?我不想每1000毫秒发射超过1个事件,节流阀现在将省略#10,因为它在#9之后太快了-我想它发射#10,因为它是最后1000毫秒间隔的唯一事件,那么它应该如何产生10?默认情况下,1为in,2/300为out,3/600为out,4/900为out,5/1200为in,6/300为out,7/600为out,8/900为out,9/1200为out,10/300为out。或者你想把它算作1/0英寸、2/300英寸、3/600英寸、4/900英寸、1000英寸、5/200英寸、6/500英寸、7/800英寸、1000英寸、8/100英寸、9/400英寸、10/700英寸。。。如果你想要10次,仅仅因为它是10次,而你期望10次发射,让我知道。好的,我明白你的意思,我不期望精确的10次-我期望一组事件,如果扼杀它们,我可能会失去最后的重要事件。所以,如果在当前1000毫秒间隔内的最新事件之后没有更多事件发生,则应将其流式传输。我曾想过通过
merge(events$.throttleTime(1000)、events$.debounceTime(1000)
组合流,但我不确定这会涵盖所有案例。我没有预先确定大小-编辑我的问题,流是无限的,10个事件是事件部分的唯一示例,因此我不能使用
last()
。我的无止境流给出了部分事件-例如,它给出了间隔为300ms的10个事件,我需要将它们限制为1000ms,但我还需要当前部分中的最后一个事件和