RxJS中的无损速率限制,具有队列清除功能

时间:2016-10-27 13:47:10

标签: rxjs rxjs5

在rxjs5中,我试图实现Throttler类。

import Rx from 'rxjs/rx';

export default class Throttler {
  constructor(interval) {
    this.timeouts = [];
    this.incomingActions = new Rx.Subject();
    this.incomingActions
      .concatMap(action => Rx.Observable.just(action).delay(interval / 2))
      .subscribe(action => action());
  }

  clear() {
    // How do I do this?
  }

  do(action) {
    this.incomingActions.next(action);
  }
}

以下不变量必须符合:

  • 传递给do的每个操作都会添加到操作队列

  • 按顺序处理操作队列,并按照构造函数参数确定的固定间隔进行处理

  • 可以使用clear()清除操作队列。

如上所示,我当前的实现处理固定间隔,但我不知道如何清除队列。它还有一个问题,即使队列为空,所有操作都会延迟interval / 2 ms。

P.S。我描述不变量的方式很容易映射到使用setInterval和数组作为队列的实现,但我想知道如何用Rx执行此操作。

1 个答案:

答案 0 :(得分:0)

这似乎不是默认Subject类的好地方。由于您列出的原因,使用您自己的子类扩展它会更好。

但是,在您的情况下,我会尝试使用某个索引标识.do(action)方法的每个操作,并在.filter()之前添加subscribe()运算符,以便能够取消特定操作检查某个数组是否标记为已取消的索引。由于您使用concatMap(),因此您知道将始终按照添加的顺序调用操作。然后,您想要的clear()方法只标记要在阵列中取消的所有操作。

您还可以在.do()之后添加concatMap()运算符,并跟踪当前使用某些累加器计划的操作数。在scheduledAction++ .do()之前传递.subscribe()时,添加操作会导致scheduledAction--。然后,您可以使用此变量来决定是否要使用.delay(interval / 2)链接新操作。