首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxJS先取,然后节流并等待

RxJS先取,然后节流并等待
EN

Stack Overflow用户
提问于 2016-05-20 07:06:04
回答 2查看 2K关注 0票数 5

我希望使用RxJS-DOM观察mousewheel事件,这样当第一个事件触发时,我会将其转发,然后丢弃任何和所有值,直到后续值之间的延迟超过先前指定的持续时间。

我想象中的运算符可能类似于:

代码语言:javascript
复制
Rx.DOM.fromEvent(window, 'mousewheel', (e) => e.deltaY)
.timegate(500 /* ms */)

想象一下下面的数据流:

代码语言:javascript
复制
0 - (200 ms) - 1 - (400ms) - 2 - (600ms) - 3

其中发送的值是数字,时间描述下一个值到达所需的时间。由于0是第一个值,因此它将被发出,然后直到3的所有值都将被丢弃,因为后续值之间的单个延迟不大于500ms

与节流不同,无论是否发出最后接收的值,都会计算值之间的时间延迟。使用节流,将发送0,将流逝200毫秒,将评估1并失败,将流逝400毫秒,将评估并通过2,因为在最后一个发射值(0)与当前接收的值(2)之间流逝的时间是600毫秒,而使用我的操作员,它将相对于1进行评估,并且流逝的时间将是400毫秒,因此测试失败。

这个运算符也不是去反跳的。它首先发送第一个值,然后根据所有未来的值进行计算,以此类推,而不是等到间隔过后才发出。

像这样的操作符已经存在了吗?如果不是,我该怎么做呢?

EN

回答 2

Stack Overflow用户

发布于 2016-05-20 10:03:45

使用timeInterval运算符可以相对容易地实现这一点,该运算符可以精确地计算连续值之间的时间间隔。下面是一个示例代码,您可以根据自己的伪装进行调整。

http://jsfiddle.net/a7uusL6t/

代码语言:javascript
复制
var Xms = 500;
var click$ = Rx.Observable.fromEvent(document, 'click').timeInterval()
var firstClick$ = click$.first().map(function(x){return x.value});

var res$ = firstClick$
  .concat(click$
    .filter(function (x) {
      console.log('interval', x.interval);
      return x.interval > Xms;})
    .map(function(x){return x.value})
   );

res$.subscribe(function(x){console.log(x)})
票数 5
EN

Stack Overflow用户

发布于 2016-05-20 11:03:03

我用类似但比@user3743222的答案更精致的方法解决了我的问题:

代码语言:javascript
复制
const events = Rx.Observable.fromEvent(window, 'mousewheel', (e) => e.deltaY);
const firstEventObservable = events.take(1);
const remainingEventsObservable = events.skip(1)
    .timeInterval()
    .filter(x => x.interval >= this.props.delayDuration)
    .map(x => x.value);
const pageChangeObservable = firstEventObservable.concat(remainingEventsObservable);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37335454

复制
相关文章

相似问题

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