RxJS.Observable debounce有什么作用?

时间:2015-06-15 08:10:30

标签: javascript rxjs debouncing

有人能用简单的英语解释RxJS Observavle debounce function的作用吗?

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

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);
});

the JsBin version

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

3 个答案:

答案 0 :(得分:20)

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

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

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

    after debounce, the emitted stream looks like as follows:

Stream 2 | ------1-------------5---------6-

忽略中间项(在本例中为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);
    }
);

我使用node来说明这一点......假设您已安装节点,可以通过键入

来运行它
$node myfile.js  (where the aforementioned code is in myfile.js)

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

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/debounce.md

还有一些很好的参考资料

答案 1 :(得分:8)

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

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

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

答案 2 :(得分:5)

如果在指定的时间间隔内没有收到任何值,

.debounce()将生成最后收到的值。

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

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