mirror of
https://github.com/giongto35/cloud-game.git
synced 2026-07-21 00:59:22 +00:00
Fix pubsub listeners indexing overlap
This commit is contained in:
parent
2a283e24db
commit
3292964f01
2 changed files with 15 additions and 16 deletions
|
|
@ -123,7 +123,7 @@
|
|||
<script src="/static/js/utils.js?v1"></script>
|
||||
<script src="/static/js/gui/message.js?v=1"></script>
|
||||
<script src="/static/js/log.js?v=5"></script>
|
||||
<script src="/static/js/event/event.js?v=5"></script>
|
||||
<script src="/static/js/event/event.js?v=6"></script>
|
||||
<script src="/static/js/input/keys.js?v=3"></script>
|
||||
<script src="/static/js/settings/opts.js?v=1"></script>
|
||||
<script src="/static/js/settings/settings.js?v=2"></script>
|
||||
|
|
|
|||
|
|
@ -6,6 +6,9 @@
|
|||
const event = (() => {
|
||||
const topics = {};
|
||||
|
||||
// internal listener index
|
||||
let _index = 0;
|
||||
|
||||
return {
|
||||
/**
|
||||
* Subscribes onto some event.
|
||||
|
|
@ -20,19 +23,16 @@ const event = (() => {
|
|||
* sub01.unsub()
|
||||
*/
|
||||
sub: (topic, listener, order) => {
|
||||
if (!topics[topic]) topics[topic] = [];
|
||||
|
||||
// order handling stuff
|
||||
const value = {order: order || 0, listener: listener};
|
||||
topics[topic].push(value);
|
||||
topics[topic].sort((a, b) => a.order - b.order);
|
||||
const index = topics[topic].indexOf(value);
|
||||
|
||||
return {
|
||||
if (!topics[topic]) topics[topic] = {};
|
||||
// order index * big pad + next internal index (e.g. 1*100+1=101)
|
||||
// use some arbitrary big number to not overlap with non-ordered
|
||||
let i = (order !== undefined ? order * 1000000 : 0) + _index++;
|
||||
topics[topic][i] = listener;
|
||||
return Object.freeze({
|
||||
unsub: () => {
|
||||
topics[topic].splice(index, 1);
|
||||
delete topics[topic][i]
|
||||
}
|
||||
};
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
@ -45,10 +45,9 @@ const event = (() => {
|
|||
* event.pub('rapture', {time: now()})
|
||||
*/
|
||||
pub: (topic, data) => {
|
||||
if (!topics[topic] || topics[topic].length < 1) return;
|
||||
|
||||
topics[topic].forEach((listener) => {
|
||||
listener.listener(data !== undefined ? data : {})
|
||||
if (!topics[topic]) return;
|
||||
Object.keys(topics[topic]).forEach((ls) => {
|
||||
topics[topic][ls](data !== undefined ? data : {})
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue