Если вы ожидаете короткую очередь событий, то решение @Martin является подходящим. Временная сложность его решения составляет O (n), где n - длина очереди, и это идеально, если n мало.
Если ваша очередь может стать длинной, то вы можете рассмотреть более быстрый подход, подобный следующему. Очередь представлена картой, отображающей уникальные идентификаторы (device_id, action) на значения. Это обеспечивает быстрый поиск существующих свойств. Временная сложность уменьшается до O (log n). Удобной реализацией карты в Javascript является использование свойств объекта, которые кодируют (device_id, action) в уникальную строку, например, "Device_id # действие". Кроме того, свойства связаны, чтобы обеспечить поведение «первым вошел / первым вышел».
var Map = {
// properties: "id#action": {value: value, next: property}
first: "",
last: "",
empty: function() {return Map.first == "";},
enque: function(device, action, value) {
var k = device + "#" + action;
if (k in Map) {
Map[k].value = value;
}
else {
Map[k] = {value: value, next: ""};
if (Map.first == "") {
Map.first = Map.last = k;
}
else {
Map[Map.last].next = k;
Map.last = k;
}
}
},
deque: function() {
var firstProp = Map.first;
var key = firstProp.split("#");
var value = Map[firstProp].value;
Map.first = Map[firstProp].next;
delete firstProp; // delete this property
return {device: key[0], action: key[1], value: value};
}
};
Карта используется следующим образом:
function addAPICall(device, action, value) {
Map.enque(device, action, value);
}
function callAPIQueue() {
if (!inCall && !Map.empty()) {
var event = Map.deque();
doAPICall(event.device, event.action, event.value);
}
}