Debounce Rx.Observable 并忽略其间发出的值

Debounce Rx.Observable & ignore values emitted in between

jsfiddle

  let sub = new Rx.Subject();
  let val = 0;
  Rx.Observable.fromEvent(window, 'scroll')
  .do(_ => val++)
  .debounceTime(500)
  .subscribe(c => sub.next(val)); 

  sub.subscribe(v => console.log(v));

我有一个 observable on scroll 事件。我想忽略它的值,除非已经过去了一段时间。

它看起来像这样(e 是事件,debounceTime500):

 ---e1----e2----e3----e4----e6-----e7 <- events

 ---n1----------------------n6------- <- notifications

 0--100------------------600------ <- time

像这样:

 ---e1----e2----e3----e4----------------- <- events

 ---n1------------------------------------- <- notifications

 0--100--------------------500------------- <- time

Debouncing and throttling are different. You seem to want throttle.

根本区别在于,去抖动将 n 个事件减少到一个,而节流每次只让一个事件通过 window。

let val = 0;
const sub = Rx.Observable.fromEvent(window, 'scroll')
  .do(_ => val++)
  .throttle(500);

sub.subscribe(v => console.log(v));

然而,这并不完美。用户可能会在 500 毫秒 window 内滚动,这样您会错过最后一次滚动。一个 solution 涉及结合节流和去抖动。不过,我不确定这是不是最好的主意。

顺便说一句,您不需要订阅一个 observable 只是为了将值从它推送到另一个 observable。只需订阅第一个 observable。