【问题标题】:How does Reactive Extension Operator SkipLast work?反应式扩展运算符 SkipLast 是如何工作的?
【发布时间】:2018-12-14 11:35:59
【问题描述】:

在 Reactivex.IO 文档中指出

您可以通过使用 SkipLast 运算符修改 Observable 来忽略 Observable 发出的最后 n 个项目,而只关注它们之前的那些项目。

以及来自http://reactivex.io/documentation/operators/skiplast.html的图表

我的期望:SkipLast 将读取整个 Observable,直到它满足 OnCompleted,然后生成一个新的 Observable,其时间与原始时间相同,但跳过最后一个。

我的疑问:SkipLast 运算符如何知道“3”是 Observable 中的 Last 2nd Item?没有看到 OnCompleted 怎么知道 Last nth Item?

【问题讨论】:

  • observable 只需要缓存n 项就可以知道它是否到达末尾以及丢弃什么。它不必在发出之前消耗所有事件,它可以缓存n 项目并在新的到达时发出最旧的。当Complete()到达时,它可以丢弃缓存的项目并自行完成
  • 在这种情况下,它可以缓存12,直到3 到达,此时它发出1。当4 到达时,它会发出4。当Complete 到达时,它会丢弃34 并完成。实际上,图中显示1 是在3 到达的同时发出的
  • observable 如何知道它在达到 3 时必须发出缓存值 1?
  • source code 很简单。
  • @PanagiotisKanavos 谢谢我明白了,它就像一个固定大小的队列。将项目入队,当由于溢出而发生出队时,它将 OnNext 出列值。

标签: rxjs rx-java reactive-programming system.reactive rx-java2


【解决方案1】:

感谢@PanagiotisKanavos、@akarnokd 提供有价值的 cmets。

它在内部使用固定大小的队列实现。从序列中取出项目并将它们排入队列,当队列已满并开始溢出时,将项目出列并将最新值排入队列并发送到 OnNext(dequeued_value),因此当 OnCompleted 到达时,您将不会发送缓存项目而只需调用 OnCompleted .至此最后 N 个缓存项被跳过。

【讨论】:

    【解决方案2】:

    如果使用skipLast(N),则来自source code,则N 消息将保存在this._ring 数组中。一旦 N+1 到达第一条消息发出,N+2 到达 => 第二条消息发出等等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2020-12-20
      相关资源
      最近更新 更多