【问题标题】:How to skip too frequent mouse events in RxJS 5 (beta)?如何在 RxJS 5 (beta) 中跳过过于频繁的鼠标事件?
【发布时间】:2016-07-25 19:23:56
【问题描述】:

我在 project 中使用 RxJS 5 (beta10)。我的大部分事件都来自鼠标或触摸拖动,我只需要听到最后一个。

即如何在 RxJS5 中做有损流?

在某些平板电脑上运行演示清楚地显示了当图形更新所用时间超过浏览器的事件触发时发生的“拖拽”(这不是连续的,甚至它本身也是不连续的 - 浏览器似乎在他们实际的间隔上进行了优化告诉事情发生了变化)。

通过有损数据流,我可以让用户体验始终跟上手指的步伐。


编辑:

This answer 似乎很好地总结了 RxJS5 背压的当前状态。

【问题讨论】:

  • 注意背压已经在 RxJS 5 中被移除,因为它有几个问题。
  • 感谢@paulpdaniels,但我不一定要在这里寻找真正的背压。 RxJS4 的“受控”就足够了,我想我会在本周末找到解决方案。当然会在这里发帖。

标签: rxjs5 backpressure


【解决方案1】:

RxJS5 auditTime 方法似乎符合我的要求。

RxJS 4 油门的问题在于它给出了某个时间窗口的 first 值,而在拖动时我真的想要最后一个(跳过中间值,如果设备的渲染速度是减缓)。 auditauditTime 正好提供了这一点。

剩下的就是实际测试效果。我在我的事件处理程序中修改了 SVG 图形,但我不确定这些更改需要多长时间才能真正在屏幕上显示。一个简单的解决方案是让用户可以调整auditTime 参数——在慢速平板电脑上,它可能需要比在台式机上稍微多一点。理想情况下,我会找到一种方法来查看浏览器渲染何时完成,然后才请求新坐标。

【讨论】:

    【解决方案2】:

    有很多不同的可能解决方案,因为有损流的定义很多。您可能想要平均拖动点,或者您可能只想查看一段时间内的第一个或最后一个。

    例如throttle 将只允许您在具有重复周期的周期内选择第一个观察值:

    rxjs github repo 上的文档

    返回一个 Observable,它只发出由 source 在指定的连续时间窗口内可观察到 期间。

    基本上,如果您想等到输入有 在采取行动之前安静一段时间,你想 去抖。它给你一种“结束的中间流”的感觉。

    如果您根本不想等待,但不希望在特定时间内处理超过 1 个观察值,则需要限制

    更复杂的“有损”算法是可能的,但它们在很大程度上取决于您的确切用例,无论您是控制帧更新率还是至少可以挂钩,等等。

    【讨论】:

    • 谢谢,本。我只是想在前一个值导致的渲染完成时获得最后一个值。 auditTime 让我接近这一点,正如我在回答中所解释的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多