Rxjs Rx:具有可变背压缓冲时间的缓冲器 我和RX玩了一段时间,但仍然认为自己对世界很陌生。我有一个问题,我想知道我是否可以通过Rx解决它。我最初的用例是C#,但以后可能需要JS中的相同用例(尽管如果答案中有任何代码片段,任何伪代码语言都可以)

Rxjs Rx:具有可变背压缓冲时间的缓冲器 我和RX玩了一段时间,但仍然认为自己对世界很陌生。我有一个问题,我想知道我是否可以通过Rx解决它。我最初的用例是C#,但以后可能需要JS中的相同用例(尽管如果答案中有任何代码片段,任何伪代码语言都可以),rxjs,system.reactive,Rxjs,System.reactive,目前,我有一个客户端应用程序,它只是缓冲它创建的数据(事务),并每5秒发送到服务器。此数据可以包含许多单独的事务,例如,它存储了许多事务,现在已联机,因此我们希望向服务器发送数千个事务。当发送如前所述的多个数据时,8秒的延迟和缓冲很好(数据已经延迟了)。但是,例如,当该客户端已连接,并且我们实时创建了一个事务(即仅1或2个单一事务)时,我希望能够立即发送这些事务,即不必等待8秒钟 所以它看起来很像,也许是交叉的?我试图用一个高级图形包(而不是)画画一个大理石图来帮助解释 因此,要完成此操作,将

目前,我有一个客户端应用程序,它只是缓冲它创建的数据(事务),并每5秒发送到服务器。此数据可以包含许多单独的事务,例如,它存储了许多事务,现在已联机,因此我们希望向服务器发送数千个事务。当发送如前所述的多个数据时,8秒的延迟和缓冲很好(数据已经延迟了)。但是,例如,当该客户端已连接,并且我们实时创建了一个事务(即仅1或2个单一事务)时,我希望能够立即发送这些事务,即不必等待8秒钟

所以它看起来很像,也许是交叉的?我试图用一个高级图形包(而不是)画画一个大理石图来帮助解释

因此,要完成此操作,将直接接收并转发第一个红色大理石。下一步,黄色大理石也会直接向前移动,因为距离最后一个红色大理石已经有1秒了

现在,浅蓝色的大理石和其他一些大理石在不到1秒的时间内出现,所以我们现在要缓冲这些,因为我们不想向网络发送可能成千上万的请求-我们将在这里做的是缓冲5秒,然后每5秒发送我们缓冲的数量,直到“爆发”已经完成了。在此之后,我们希望返回发送任何其他“个人”请求

它不必完全像上面那样,基本上我们想要的

  • 个人交易(通过连接的客户端应用程序向用户输入),立即发送(或一些非常小的延迟)

  • 检测我们何时开始获得许多事务,并开始 “节流”,然后以更长的时间间隔发送缓冲批次(例如5或8秒)

  • 不想扔掉任何交易(弹珠),我想把它们全部发送出去

我发现许多其他帖子都很相似,但与此不同

我想出了一些笨拙的“手动”方法(只使用标准列表和各种计时器等),但我想知道是否可以使用Rx来完成一些工作,并且希望不太容易出现错误


在此提前感谢您的帮助

我想你已经选择了它,
buffer
debounce
作为缓冲触发器

例如,当此客户端已连接时

如果要添加连接事件,也可以将其合并到
bufferTrigger

console.clear()
const source=new Rx.Subject();
const bufferTrigger=source.debounceTime(500);
来源
.缓冲区(缓冲触发器)
.subscribe(console.log);
setTimeout(()=>source.next('red'),0);
setTimeout(()=>source.next('yellow'),1000);
setTimeout(()=>source.next('lightblue'),3000);
setTimeout(()=>source.next('green'),3100);
setTimeout(()=>source.next('blue'),3200);
setTimeout(()=>source.next('pink'),4000)

感谢您的上述回答。这很接近,但我唯一想做的另一件事是在一段时间后“强制发射”,如果我们仍然有来袭。我已经复制并添加到您的示例中,(使用浏览器开发工具查看控制台输出),如果您查看最后一批,它们直到9秒才会发出,但我希望以5秒的间隔发出我们目前为止的,然后以5秒的间隔发出其余的,直到完成,这样我们可以重新开始整个模式。啊哈,我觉得太简单了:)。基本上,您可以使用merge操作符将额外的事件添加到bufferTrigger,
const bufferTrigger=source.debounceTime(500).merge(someOtherObservable)
。那么,这是最后一次发射后的5秒吗?(例如黄色后5秒?)我已附加了我对附加标准的看法。如果不完全正确,请让我知道,我明天会再次拿起它。因此,最初我们添加了2个“慢”数据位,我们希望立即发射。但是一旦我们到达浅蓝色,所有其他的都会很快进入,所以我们的想法是批量处理这些,每5秒钟发送我们所拥有的任何东西。例如,我们可能有5.525s浅蓝色,绿色,蓝色1,蓝色2,蓝色3,pink1,pink2,pink3,pink4,然后5秒后另一批,例如10.525s pink5,pink6,pink7,pink8,pink9,pink10,pink11,pink12,pink13。如果我们继续快速获取要发送的数据,比如说<1s(例如,wa循环遍历数据库中的记录,我们每5秒批处理并发送一次。一旦完成上述操作(例如,脱机时存储的数据数据库中的所有记录都消失了),我们可能没有更多的数据添加到然后发射。例如,在最后一个pink13之后,pink14直到pink13之后超过1秒才被添加。因此,既然我们有了这个中断,我们可以立即返回到发射pink14。因此,我们只想在快速添加大量数据时批处理更长的时间,然后当停止时,返回立即发送“单个”数据。我可能没有完全理解我的大理石图来反映我的意思。