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上也有一些很好的参考资料.
长话短说:debounce等待X时间流不发出任何新值,然后让最新值通过.
长篇小说:一旦发出一个值,去抖将暂停其X发射时间以查看是否发出了另一个值,实际上在此期间阻塞了该流.如果在去抖时间期间发出新值,则重新启动定时器并且去抖动等待全部时间.如果它的计时器到期而没有发出任何新值,它会让最新的值通过.
假设您要将自动完成添加到输入框.如果用户插入"a",您可能希望向他显示"橡子,阿拉斯加"的选择,但如果用户在按"l"后立即提出"阿拉斯加".在这种情况下,最好等待用户停止按键盘以避免做不必要的工作.debounce它是正确的工具:它等待X时间流不发出任何新值
.debounce()
如果在指定的时间间隔内未收到任何值,则生成最后收到的值.
这意味着只要你在一秒钟内点击 - 就不会产生任何东西.
如果您希望限制要发出的值不会比每秒需要使用的更频繁.sample(1000)
.
归档时间: |
|
查看次数: |
11379 次 |
最近记录: |