Rxswift3.0 中的 throttle 和 debounce 有什么区别?

What's the difference between throttle and debounce in Rxswift3.0?

看了很多关于油门和去抖的博客。他们中的大多数人说他们是同一件事。但是我从我的例子中得到了不同的结果?这是示例:

let disposeBag = DisposeBag()
Observable.of(1,2,3,4,5)
          .debounce(1, scheduler: MainScheduler.instance)
          .subscribe(onNext: {print([=10=])})
          .addDisposableTo(disposeBag)

结果是5。但是当我使用油门时,结果是1

let disposeBag = DisposeBag()
Observable.of(1,2,3,4,5)
        .throttle(1, scheduler: MainScheduler.instance)
        .subscribe(onNext: {print([=11=])})
        .addDisposableTo(disposeBag)

那么,我对油门操作器是不是很了解?

在 RxSwift 的早期版本中,throttledebounce 做了同样的事情,这就是为什么你会看到文章说明这一点。在 RxSwift 3.0 中,他们做了类似但相反的事情。

debouncethrottle 都用于过滤 observable 随时间发出的项目。

  • throttle 仅发出源可观察对象在时间 window.

  • 发出的第一个项目
  • debounce 仅在指定的时间段过去后发出一个项目,而源 observable 没有发出另一个项目。

两者都可用于减少 observable 发出的项目数量;您使用哪一个取决于您是否希望在一段时间内发出 "first" 或 "last" 值。

术语 "debounce" 来自电子学,指的是当发生开关动作时,开关触点 "bounce" 在打开和关闭之间非常快速地变化的趋势。当您打开灯泡时,您不会注意到这一点,但微处理器每秒查看输入数千次,在开关进入最终状态之前会看到 "ons" 和 "offs" 的快速序列。这就是为什么 debounce 给你 5 的价值;在您的时间范围内(1 毫秒)发出的最后一项。如果你在你的代码中加入一个时间延迟,使这些项目发射得更慢(相隔超过 1 毫秒),你会看到 debounce.

发射的许多项目

在应用程序中,您可以使用 debounce 来执行昂贵的搜索(假设它需要网络操作)。用户将要为他们的搜索字符串键入许多字符字符,但您不想在他们输入每个字符时启动搜索,因为搜索成本很高,并且较早的结果在他们 return.使用 debounce 可以确保仅在用户停止输入一段时间(比如 500 毫秒)后才发出搜索字符串。

您可能会使用 throttle,因为操作需要一些时间,并且您希望在这段时间过去之前忽略进一步的输入。假设您有一个启动操作的按钮。如果用户快速连续多次点击按钮,您只想启动一次操作。您可以使用 throttle 忽略指定时间内的后续点击 window。 debounce 也可以工作,但会在发出操作项之前引入延迟,而 throttle 允许您对第一个操作做出反应并忽略其余操作。

这里有简单的解释https://medium.com/fantageek/throttle-vs-debounce-in-rxswift-86f8b303d5d4

Throttle:原函数在指定时间内最多调用一次

Debounce: 调用者在指定时间后停止调用装饰函数后调用原始函数。