RxJS.Observable debounce有什么作用?

Adr*_*ian 18 javascript rxjs debouncing

任何人都可以用简单的英语解释RxJS Observavle去抖功能的作用吗?

我想它会偶尔发出一个事件,具体取决于参数,但我的代码不能像我预期的那样工作.

var x$ = Rx.Observable.fromEvent(window, 'click')
.map(function(e) {return {x:e.x, y:e.y};})
.debounce(1000)
.subscribe(function(el) {
  console.log(el);
});
Run Code Online (Sandbox Code Playgroud)

JsBin版本.

我希望这个代码每秒打印一次,无论我点击多快.相反,它打印我认为是随机间隔的点击.

Eri*_*oda 20

在指定的时间间隔过去之后,去抖将发出一个值,而不会发出另一个值.

使用简单的图表可以提供更多帮助:

Stream 1 | ---1-------2-3-4-5---------6----

    after debounce, the emitted stream looks like as follows:

Stream 2 | ------1-------------5---------6-
Run Code Online (Sandbox Code Playgroud)

中间项(在本例中为2,3,4)将被忽略.

下面举例说明:

var Rx = require('rx-node');
var source = Rx.fromStream(process.stdin).debounce(500);
var subscription = source.subscribe(
    function (x) {
        console.log('Next: %s', x);
    }
);
Run Code Online (Sandbox Code Playgroud)

我使用node来说明这一点......假设你安装了节点,你可以通过输入来运行它

$node myfile.js  (where the aforementioned code is in myfile.js)
Run Code Online (Sandbox Code Playgroud)

一旦启动此节点程序,您可以在控制台上键入值 - 如果您快速键入项目将被忽略,如果间歇性地输入快速和慢速项目将在键入的间隙(在上面的示例中,我有500毫秒)后出现在控制台("下一个: ")

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/debounce.md上也有一些很好的参考资料.


Ric*_*lli 9

长话短说:debounce等待X时间流不发出任何新值,然后让最新值通过.

长篇小说:一旦发出一个值,去抖将暂停其X发射时间以查看是否发出了另一个值,实际上在此期间阻塞了该流.如果在去抖时间期间发出新值,则重新启动定时器并且去抖动等待全部时间.如果它的计时器到期而没有发出任何新值,它会让最新的值通过.

假设您要将自动完成添加到输入框.如果用户插入"a",您可能希望向他显示"橡子,阿拉斯加"的选择,但如果用户在按"l"后立即提出"阿拉斯加".在这种情况下,最好等待用户停止按键盘以避免做不必要的工作.debounce它是正确的工具:它等待X时间流不发出任何新值


zer*_*kms 5

.debounce() 如果在指定的时间间隔内未收到任何值,则生成最后收到的值.

这意味着只要你在一秒钟内点击 - 就不会产生任何东西.

如果您希望限制要发出的值不会比每秒需要使用的更频繁.sample(1000).