Roy*_*mir 6 javascript rxjs rxjs5
当我滚动窗口时,我正在使用一个被限制的流.
在限制时(只要滚动),它会向控制台发出值.
但是,当流空闲时(用户没有滚动窗口) - 我想要一个计时器启动.但是 - 如果用户再次开始滚动 - 我不希望该计时器发出值.
目前我这样做:
const observable = Rx.Observable.fromEvent(window, 'scroll');
const subscriber = observable
.throttleTime(300 )
.map(() => 'throttle')
.merge(Rx.Observable.interval(1000).map(() => 'tick') )
.subscribe(
(x) => {
console.log('Next: event!', x);
},
(err) => {
console.log('Error: %s', err);
},
() => {
console.log('Completed');
});
Run Code Online (Sandbox Code Playgroud)
问题是,在滚动时 - 我看到两个"throttle"AND "tick" (我应该只看到"油门")
从另一个POV想想这个.工作总是必须运行.如果我滚动 - 那个受限制的滚动 - 应该调用这个工作.如果我不滚动 - 计时器应该开始并开始完成工作.(如果用户再次开始滚动,则停止).
问题:
如何在不滚动的空闲时间后启动计时器?
我会这样做:
const scroll$ = Rx.Observable.fromEvent(window, 'scroll')
.throttleTime(300 /* ms */)
.publish();
scroll$.connect();
const subscriber = scroll$
.map(() => 'throttle')
.race(Rx.Observable.interval(1000).map(() => 'tick'))
.take(1)
.repeat()
.subscribe(
(x) => {
console.log('Next: event!', x);
},
(err) => {
console.log('Error: %s', err);
},
() => {
console.log('Completed');
});
Run Code Online (Sandbox Code Playgroud)
这使用race()运算符仅订阅首先发出的 Observable,即 1interval或滚动事件。之后我想以另一个间隔再次开始,所以我使用take(1).repeat().
我还必须将scroll$Observable 变成热 Observable,以保持throttleTime()重复订阅中的运行。
您更新的演示:https://plnkr.co/edit/sWzSm32uoOQ1hOKigo4s ?p=preview
| 归档时间: |
|
| 查看次数: |
1340 次 |
| 最近记录: |