Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RxJS:常规采样的去盎司_Javascript_Rxjs - Fatal编程技术网

Javascript RxJS:常规采样的去盎司

Javascript RxJS:常规采样的去盎司,javascript,rxjs,Javascript,Rxjs,我有一个可观察的,它从用户输入中发出一个值流(滑块的偏移值) 我想对该流进行去抖动,所以当用户忙于滑动时,我只会在100ms内没有任何东西通过时发出一个值,以避免被值淹没。但如果只是无休止地去抖动(用户不断地来回滑动),我还希望每1秒发出一个值。一旦用户停止滑动,我只想从去抖动的流中得到最终值 所以我想把去盎司和流的常规“采样”结合起来。现在,我的设置如下所示: const debounce$ = slider$.debounceTime(100), sampler$ = slide

我有一个
可观察的
,它从用户输入中发出一个值流(滑块的偏移值)

我想对该流进行去抖动,所以当用户忙于滑动时,我只会在100ms内没有任何东西通过时发出一个值,以避免被值淹没。但如果只是无休止地去抖动(用户不断地来回滑动),我还希望每1秒发出一个值。一旦用户停止滑动,我只想从去抖动的流中得到最终值

所以我想把去盎司和流的常规“采样”结合起来。现在,我的设置如下所示:

const debounce$ = slider$.debounceTime(100),
      sampler$ = slider$.auditTime(1000);

debounce$
    .merge(sampler$)
    .subscribe((value) => console.log(value));
假设用户移动滑块2.4秒,则会发出如下值:

 start                      end
  (x)---------|---------|---(x)|----|
              |         |      |    |
             1.0       2.0    2.5  3.0  <-- unwanted value at the end
              ^         ^      ^
            sample   sample   debounce  <-- these are all good
开始-结束
(x) -------------------------------------(x)|----|
|         |      |    |

1.0 2.0 2.5 3.0您可以通过合成一个作为信号的可观察对象来解决问题,该信号指示用户当前是否在滑动。这应该做到:

const sliding$ = slider$.mapTo(true).merge(debounce$.mapTo(false));
您可以使用它来控制
采样器$
是否发出值

一个有效的例子:

const-since=Date.now();
常量滑块$=新Rx.Subject();
const debounce$=滑块$.debounceTime(100);
常量滑动$=滑块$.mapTo(true).merge(去盎司$.mapTo(false));
常量采样器$=滑块$
.审核时间(1000)
.withLatestFrom(滑动美元)
.filter(([值,滑动]=>滑动)
.map(([value])=>value);
去盎司$
.merge(sampler$)
.subscribe(value=>console.log(`${time()}:${value}`));
//模拟滑动:
设值=0;
对于(设i=0;i 0.5?1:-1;
幻灯片(值,i);
}
功能幻灯片(值,at){
setTimeout(()=>滑块$.next(值),在);
}
功能时间(){
返回'T+${((Date.now()-before)/1000.toFixed(3)}';
}
。作为控制台包装{最大高度:100%!重要;顶部:0;}

对于那些感兴趣的人来说,这就是我所采取的方法,灵感来源于


不同之处在于在
滑动$
流中添加
distinctUntilChanged
,以仅获取开/关更改,然后在该流上执行
开关映射
,以获得或不获得采样器返回值。

太棒了!添加
滑动$
流的想法让我明白了如何处理这个问题。我同意一个稍有不同的变体,使用我将在下面发布的
开关映射
,但它遵循相同的原则。您可以让我知道您的想法。我可能会进一步强调
审核时间
是关键。当您能够接受时,您应该接受自己的答案。我给出的答案不完整,不涉及重置
采样器$
。您的采样器是,而且是更好的答案。
const slider$ = new Rx.Subject();
const nothing$ = Rx.Observable.never();

const debounce$ = slider$.debounceTime(100);
const sliding$ = slider$.mapTo(true)
  .merge(debounce$.mapTo(false))
  .distinctUntilChanged();

const sampler$ = sliding$
  .switchMap((active) => active ? slider$.auditTime(1000) : nothing$);

debounce$
  .merge(sampler$)
  .subscribe(value => console.log(`${time()}: ${value}`));