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

具有队列清除的RxJS中的无损速率限制,rxjs,rxjs5,Rxjs,Rxjs5,在rxjs5中,我试图实现一个节流器类 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(a

在rxjs5中,我试图实现一个
节流器

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


另外,我描述不变量的方式很容易映射到使用setInterval和数组作为队列的实现,但我想知道如何使用Rx来实现这一点。

对于默认的
主题
类来说,这似乎不是一个好地方。使用您自己的子类扩展它会更好,因为您列出了一些原因

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


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

对于默认的
主题
类来说,这似乎不是一个好地方。使用您自己的子类扩展它会更好,因为您列出了一些原因

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

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