有人能用简单的英语解释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);
});
我希望这段代码每秒打印一次,无论我点击多快。相反,它会按我认为的随机间隔打印点击。
答案 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)
。