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