RxJS.Observable 去抖动有什么作用?

What does RxJS.Observable debounce do?

谁能用简单的英语解释一下 RxJS Observable 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.

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

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

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

意思是一秒内点击,什么都不会产生。

如果您希望限制值的发出频率不超过每秒,您需要使用 .sample(1000)

Debounce 将在指定的时间间隔过去后发出一个值,而没有发出另一个值。

使用下面的简单图表可能会提供更大的帮助:

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,您可以通过键入

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

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

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

也有一些很好的参考 material

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

长话短说: 一旦发出一个值,debounce 将暂停其发出 X 时间,以查看是否发出另一个值,实际上在这段时间内阻塞流。如果在 debounce 时间内发出新值,则计时器将重新启动并且 debounce 再次等待完整时间。 如果它的计时器到期而没有发出任何新值,它会让最新的值通过。

假设您要为输入框添加自动完成功能。如果用户插入 "a",您可能想向他显示选项 "acorn, alaska",但如果用户在按下 "l" 后立即显示,您将只建议 "alaska"。在这种情况下,最好等待用户停止按下键盘以避免做不必要的工作。 debounce 它在这里是正确的工具:它等待 X 时间流不发出任何新值