From 3292964f01beaaae4060c7b85d3f3f23c4fa9686 Mon Sep 17 00:00:00 2001 From: Sergey Stepanov Date: Sun, 2 Jan 2022 06:57:53 +0300 Subject: [PATCH] Fix pubsub listeners indexing overlap --- web/index.html | 2 +- web/js/event/event.js | 29 ++++++++++++++--------------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/web/index.html b/web/index.html index 19b55325..317b8f85 100644 --- a/web/index.html +++ b/web/index.html @@ -123,7 +123,7 @@ - + diff --git a/web/js/event/event.js b/web/js/event/event.js index 10c3d018..ef626925 100644 --- a/web/js/event/event.js +++ b/web/js/event/event.js @@ -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 : {}) }); } }