首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >RxJS Buffer,如何将多次点击事件分组为流

RxJS Buffer,如何将多次点击事件分组为流
EN

Stack Overflow用户
提问于 2016-05-19 05:47:16
回答 7查看 6.7K关注 0票数 8

RxJS版本2.2.26中的

下面的代码产生了一个流,它将发出点击次数(双击、三次单击等)。

代码语言:javascript
复制
var multiClickStream = clickStream
    .buffer(function() { return clickStream.throttle(250); })
    .map(function(list) { return list.length; })
    .filter(function(x) { return x >= 2; });

RxJS版本4.0.6中的

此代码不再生成所需的结果。

如何在RxJS 4.0.6中获得相同功能?

Working 2.2.26 Example

Broken 4.0.6 Example

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2016-05-19 06:25:12

我想从RxJS 3开始,throttle已经改为debounce了。

当最初的命名方案实际上与Rx的其他实现或实际定义不匹配时,关于这种方式有很大的争论。

https://github.com/Reactive-Extensions/RxJS/issues/284

在RxJS 5的重新实现过程中,它甚至成功地迷惑了人们:https://github.com/ReactiveX/rxjs/issues/480

票数 1
EN

Stack Overflow用户

发布于 2016-10-14 15:15:41

实际上,有一种更好的方法可以通过RxJ找到双击:

代码语言:javascript
复制
var mouseDowns = Rx.Observable.fromEvent(button, "mousedown");

var doubleClicks = mouseDowns.timeInterval()
                             .scan<number>((acc, val) => val.interval < 250 ? acc + 1 : 0, 0)
                             .filter(val => val == 1);

这样做的好处是,您不需要等待完整的250ms来识别双击-如果用户在两次单击之间只有120ms,则双击和结果操作之间会有明显的延迟。

请注意,通过向上计数(使用.scan())并过滤到第一个计数,我们可以将流限制为仅双击,并忽略此后的每一次快速单击-因此单击不会导致两次双击。

票数 12
EN

Stack Overflow用户

发布于 2016-08-03 20:57:41

如果有人想知道如何在RxJS 5 (5.0.0-beta.10)上做同样的事情,我是这样做的:

代码语言:javascript
复制
const single$ = Rx.Observable.fromEvent(button, 'click');
single$
    .bufferWhen(() => single$.debounceTime(250))
    .map(list => list.length)
    .filter(length => length >= 2)
    .subscribe(totalClicks => {
        console.log(`multi clicks total: ${totalClicks}`);
    });

我花了很多时间试图弄清楚这一点,因为我也在学习反应式编程(使用RxJS),所以,如果你在这个实现中看到问题,或者知道做同样事情的更好的方法,我将非常高兴地知道!

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37310640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档