mirror of
https://github.com/mozilla/pdf.js.git
synced 2026-08-02 12:27:21 +02:00
Re-factor the EventBus to use Map/Set internally
Especially the Array to Set conversion should be helpful, since adding/removing elements from a Set is more efficient.
This commit is contained in:
parent
ce4ff55faa
commit
0d5df9d96e
@ -14,6 +14,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { INTERNAL_EVT, internalOpt } from "./internal_evt.js";
|
import { INTERNAL_EVT, internalOpt } from "./internal_evt.js";
|
||||||
|
import { makeSet } from "pdfjs-lib";
|
||||||
|
|
||||||
const WaitOnType = {
|
const WaitOnType = {
|
||||||
EVENT: "event",
|
EVENT: "event",
|
||||||
@ -72,7 +73,7 @@ async function waitOnEventOrTimeout({ target, name, delay = 0 }) {
|
|||||||
* and `off` methods. To raise an event, the `dispatch` method shall be used.
|
* and `off` methods. To raise an event, the `dispatch` method shall be used.
|
||||||
*/
|
*/
|
||||||
class EventBus {
|
class EventBus {
|
||||||
#listeners = Object.create(null);
|
#listeners = new Map();
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) {
|
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) {
|
||||||
@ -101,8 +102,7 @@ class EventBus {
|
|||||||
signal.addEventListener("abort", onAbort);
|
signal.addEventListener("abort", onAbort);
|
||||||
}
|
}
|
||||||
|
|
||||||
const eventListeners = (this.#listeners[eventName] ??= []);
|
this.#listeners.getOrInsertComputed(eventName, makeSet).add({
|
||||||
eventListeners.push({
|
|
||||||
listener,
|
listener,
|
||||||
internal: options?.internal === INTERNAL_EVT,
|
internal: options?.internal === INTERNAL_EVT,
|
||||||
once: options?.once === true,
|
once: options?.once === true,
|
||||||
@ -116,17 +116,11 @@ class EventBus {
|
|||||||
* @param {Object} [options]
|
* @param {Object} [options]
|
||||||
*/
|
*/
|
||||||
off(eventName, listener, options = null) {
|
off(eventName, listener, options = null) {
|
||||||
const eventListeners = this.#listeners[eventName];
|
const eventListeners = this.#listeners.get(eventName);
|
||||||
if (!eventListeners) {
|
const evt = eventListeners?.keys().find(e => e.listener === listener);
|
||||||
return;
|
if (evt) {
|
||||||
}
|
evt.rmAbort?.(); // Ensure that the `AbortSignal` listener is removed.
|
||||||
for (let i = 0, ii = eventListeners.length; i < ii; i++) {
|
eventListeners.delete(evt);
|
||||||
const evt = eventListeners[i];
|
|
||||||
if (evt.listener === listener) {
|
|
||||||
evt.rmAbort?.(); // Ensure that the `AbortSignal` listener is removed.
|
|
||||||
eventListeners.splice(i, 1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,14 +129,14 @@ class EventBus {
|
|||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
*/
|
*/
|
||||||
dispatch(eventName, data) {
|
dispatch(eventName, data) {
|
||||||
const eventListeners = this.#listeners[eventName];
|
const eventListeners = this.#listeners.get(eventName);
|
||||||
if (!eventListeners?.length) {
|
if (!eventListeners?.size) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let extListeners;
|
let extListeners;
|
||||||
// Making copy of the listeners array in case if it will be modified
|
// Always create a copy of the listeners in case they are modified
|
||||||
// during dispatch.
|
// during dispatch.
|
||||||
for (const { listener, internal, once } of eventListeners.slice(0)) {
|
for (const { listener, internal, once } of new Set(eventListeners)) {
|
||||||
if (once) {
|
if (once) {
|
||||||
this.off(eventName, listener);
|
this.off(eventName, listener);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user