去抖动Rx.Observable&忽略两者之间发出的值

时间:2017-05-24 00:21:35

标签: javascript rxjs reactive-programming rxjs5

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。除非经过一段时间,否则我想忽略它的值。

它看起来像这样(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

1 个答案:

答案 0 :(得分:3)

Debouncing and throttling are different。你似乎想要throttle

根本区别在于,当debouncing将 n 事件减少为1时,限制每个时间窗口只允许一个事件。

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

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

然而,这并不完美。用户可能会在500毫秒的窗口内滚动,以至于您错过了最后一个滚动。一个solution涉及结合限制和去抖动。不过,我不确定这是最好的主意。

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