Создайте функцию идентификатора, которая может идентифицировать операции, которые вы хотите обнаружить, как одинаковые.Присвойте идентификатор как свойство анонимной функции, которую вы добавляете в очередь.Когда вы перебираете очередь, записывайте идентификаторы в коллекцию.Не выполняйте операцию, если она уже находится в коллекции.
function doSomething(someArg:Object):void {
if (conditionIsFalse){
var operation = function(){
doSomething(someArg);
};
operation.operationID = objID(...);
operationsToDoWhenConditionIsTrue.push(operation);
}
}
function onConditionBecomingTrue():void {
var done = {}, f;
while (operationsToDoWhenConditionIsTrue.length > 0){
f = operationsToDoWhenConditionIsTrue.shift();
if (! f.operationID in done) {
done[f.operationID] = true;
f()
}
}
}
В качестве более эффективного варианта вы можете индексировать очередь по идентификаторам, чтобы функцию можно было добавить в очередь только один раз.Однако вы потеряете контроль над порядком выполнения операций.
var operationsToDoWhenConditionIsTrue:Object = {};
function doSomething(someArg:Object):void {
if (conditionIsFalse){
operation.operationID = ...;
operationsToDoWhenConditionIsTrue[objID(...)] = function(){
doSomething(someArg);
};
}
}
function onConditionBecomingTrue():void {
for (id in operationsToDoWhenConditionIsTrue){
operationsToDoWhenConditionIsTrue[id]();
}
operationsToDoWhenConditionIsTrue = {};
}
Если вам нужно сохранить последовательность (чтобы операции выполнялись в том порядке, в котором они были сначала добавлены в очередь, или в порядкеони были добавлены в последний раз), создайте тип очереди, который можно индексировать как по идентификатору, так и по последовательности, что можно сделать, сохранив сопоставления между типами индекса.Примечание: следующее не проверено.
class OperationQueue {
protected var queue:Array = [];
protected var idToSeq:Object = {};
public function push(op:Function):void {
/* Orders by last insertion. To order by first insertion,
simply return if the operation is already in the queue.
*/
if (op.id in this.idToSeq) {
var seq = this.idToSeq[op.id];
delete this.queue[seq];
}
this.queue.push(op);
this.idToSeq[op.id] = this.queue.length-1;
}
public function runAll():void {
var op;
while (this.queue.length > 0) {
if ((op = this.queue.shift())) {
delete this.idToSeq[op.id];
op();
}
}
}
}