在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执行此操作。
答案 0 :(得分:0)
这似乎不是默认Subject
类的好地方。由于您列出的原因,使用您自己的子类扩展它会更好。
但是,在您的情况下,我会尝试使用某个索引标识.do(action)
方法的每个操作,并在.filter()
之前添加subscribe()
运算符,以便能够取消特定操作检查某个数组是否标记为已取消的索引。由于您使用concatMap()
,因此您知道将始终按照添加的顺序调用操作。然后,您想要的clear()
方法只标记要在阵列中取消的所有操作。
您还可以在.do()
之后添加concatMap()
运算符,并跟踪当前使用某些累加器计划的操作数。在scheduledAction++
.do()
之前传递.subscribe()
时,添加操作会导致scheduledAction--
。然后,您可以使用此变量来决定是否要使用.delay(interval / 2)
链接新操作。