/
RaskolnickOFF
/
3D
Обзор
Документация
Войти
/
RaskolnickOFF
/
3D
Код
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
js/source/core/EventBus.js
83 строки
3 KB
RaskolnickOFF
Structure update
06 июн 2026, 03:18
06 июн 2026, 03:18
9bc1c25
Код
Авторство
О чём код?
// js/source/core/EventBus.js export class EventBus { constructor() { this._listeners = new Map(); } on(event, callback) { if (!this._listeners.has(event)) { this._listeners.set(event, []); } this._listeners.get(event).push(callback); } off(event, callback) { const list = this._listeners.get(event); if (list) { const idx = list.indexOf(callback); if (idx !== -1) list.splice(idx, 1); } } emit(event, data) { const list = this._listeners.get(event); if (list) { for (const cb of list) { cb(data); } } } // УЛУЧШЕНИЯ ДЛЯ ТЕСТИРОВАНИЯ: // 1. once(event, callback) — одноразовая подписка. // callback сработает один раз и автоматически отпишется. // Пригодится для GAME_LOADED, WORLD_GENERATED, PLAYER_FIRST_SPAWN. // once(event, callback) { // const wrapper = (data) => { // this.off(event, wrapper); // callback(data); // }; // this.on(event, wrapper); // } // 2. emit с копией массива — защита от бага, если off() вызывается // внутри колбэка во время emit(). Меняем: // for (const cb of list) { // на: // for (const cb of [...list]) { // Копия массива защищает итерацию от splice внутри off(). // 3. off через filter — альтернатива indexOf + splice, // короче и без ручного поиска индекса: // off(event, callback) { // const list = this._listeners.get(event); // if (list) { // this._listeners.set(event, list.filter(cb => cb !== callback)); // } // } // 4. clear(event?) — массовая отписка. // Без аргумента чистит все события. С аргументом — одно событие. // clear(event) { // if (event) { // this._listeners.delete(event); // } else { // this._listeners.clear(); // } // } // 5. listenerCount(event) — количество подписчиков на событие. // Для отладки: eventBus.listenerCount('DAMAGE_DEALT'). // listenerCount(event) { // const list = this._listeners.get(event); // return list ? list.length : 0; // } // 6. events() — список всех событий, на которые есть подписчики. // Для отладки: eventBus.events() → ['DAMAGE_DEALT', 'PLAYER_DIED', ...] // events() { // return [...this._listeners.keys()]; // } }