RXJS - 仅在空闲时启动计时器?

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想想这个.工作总是必须运行.如果我滚动 - 那个受限制的滚动 - 应该调用这个工作.如果我不滚动 - 计时器应该开始并开始完成工作.(如果用户再次开始滚动,则停止).

问题:
如何在不滚动的空闲时间后启动计时器?

PLNKR

mar*_*tin 2

我会这样做:

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