18

任何人都可以用简单的英语解释RxJS Observable debounce 函数的作用吗?

我想它会根据参数不时发出一个事件,但是我下面的代码没有按我的预期工作。

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

JsBin 版本

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

4

3 回答 3

20

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 myfile.js  (where the aforementioned code is in myfile.js)

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

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

于 2015-06-15T18:02:54.727 回答
9

长话短说:去抖动等待 X 时间流没有发出任何新值,然后让最新值通过。

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

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

于 2016-12-03T14:15:35.217 回答
5

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

这意味着只要您在一秒钟内单击 - 将不会产生任何内容。

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

于 2015-06-15T08:30:39.067 回答