Debounce Rx.Observable 并忽略其间发出的值
Debounce Rx.Observable & ignore values emitted in between
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 是事件,debounceTime
是 500
):
---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。
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 是事件,debounceTime
是 500
):
---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。