在此运算符中,每次接收到值时都会启动时间窗口。窗口到期后,将发出该值。可是,若是在窗口到期以前收到另外一个值,则拒绝前一个值,窗口将从新开始下一个值。ios
证实这一点有点复杂,由于一个可观察的区间要么接受它的全部值,要么只接受它的最后一个值(若是可观察的是无限的,则永远不会)。所以,咱们将构建一个更复杂的可观察对象。git
输出:github
正如咱们在这里看到的,咱们的可观测量将快速连续发出4个值,而后是更大间隔中的3个值,最后是快速连续的3个值。扫描仅用于将值转换为天然序列,而不是3次重复1,2,3。前两个发射同时发生的缘由是该扫描一块儿发射初始值和第一个值。函数
如今咱们了解了咱们的源可观察性,让咱们去 debounce 它:spa
日志输出:3d
咱们以150毫秒的窗口进行了 debounce。咱们可观察到的爆发速度比那个(100毫秒)要快,因此只有每一个爆发中的最后一个值才能经过。在咱们可观察的较慢部分期间,全部值都被接受,由于150ms窗口在下一个值到达以前到期。日志
有一个throttleWithTimeout运算符,它与咱们刚刚看到的debounce运算符具备相同的行为。一个其实是另外一个的别名,即便文档中没有正式宣布这两个。对象
您还能够根据每件商品进行去抖动。在这种状况下,您提供了一个函数,该函数计算每一个项目后窗口应该有多长。您发出信号代表窗口正在为每一个项目使用新的可观察对象。当observable终止时,窗口到期。blog
在下一个示例中,每一个值i的窗口大小为i * 50ms。ci
日志输出:
让咱们将每一个项目映射到其窗口的长度以及下一个项目实际到达的时间
咱们如今能够看到为何值如此。
该运算符对于经历不肯定时期的可观察量是有用的,其中值常常从一个非肯定状态变化到另外一个非肯定状态。例如,假设您正在监视文本字段的内容,而且您但愿根据用户正在写入的内容提供建议。您能够在每次按键时从新计算您的建议,但这样会太嘈杂并且成本过高。相反,若是您去除了对文本字段的更改,则只有在用户暂停或完成输入时才会提供建议。
原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%203%20-%20Taming%20the%20sequence/5.%20Time-shifted%20sequences.md
下节继续!
有什么讨论的内容,能够加我公众号: