Система событий и подписок

Mind.js предоставляет мощный механизм для организации событийной модели и управления потоками данных внутри приложений. Система событий основана на концепции наблюдателя (observer) и позволяет создавать подписки на изменения состояния объектов, что делает код гибким и легко масштабируемым.


Основные компоненты событийной модели

  1. Emitter Центральный элемент событийной системы — объект, способный генерировать события. В Mind.js это реализуется через класс EventEmitter. Каждый Emitter поддерживает:

    • Регистрацию подписчиков;
    • Генерацию событий с произвольными данными;
    • Удаление подписчиков.

    Пример создания объекта-эмиттера:

    const { EventEmitter } = require('mind.js');
    
    const emitter = new EventEmitter();
  2. Подписчик (Listener) Подписчик — это функция, которая вызывается при наступлении события. Она получает объект с данными события и может выполнять любые действия.

    Регистрация подписчика выполняется методом on:

    emitter.on('dataChanged', (data) => {
        console.log('Новое значение:', data);
    });
  3. Удаление подписчиков Для предотвращения утечек памяти и контроля над подписками используется метод off:

    const listener = (data) => console.log('Обновление:', data);
    emitter.on('update', listener);
    emitter.off('update', listener);

Типы событий

Mind.js поддерживает несколько категорий событий:

  • Синхронные события – обработчики вызываются немедленно после генерации события.
  • Асинхронные события – обработчики вызываются с задержкой или через очередь событий, что позволяет избегать блокировки основного потока.

Использование асинхронного события:

emitter.on('asyncEvent', async (payload) => {
    await someAsyncFunction(payload);
    console.log('Асинхронная обработка завершена');
});

Параметры и данные событий

События могут передавать любые данные. Mind.js рекомендует использовать объектную структуру для передачи информации:

emitter.emit('userLoggedIn', { userId: 123, timestamp: Date.now() });

Доступ к данным осуществляется напрямую в функции-подписчике:

emitter.on('userLoggedIn', ({ userId, timestamp }) => {
    console.log(`Пользователь ${userId} вошел в систему в ${new Date(timestamp)}`);
});

Группировка событий

Для удобства управления можно создавать группы событий, позволяя подписчикам реагировать на несколько событий одновременно:

emitter.on(['start', 'stop'], (event) => {
    console.log(`Событие ${event.type} произошло`);
});

Метод emit автоматически передает тип события подписчику.


Подписки с фильтром

Mind.js позволяет фильтровать события, чтобы подписчик реагировал только на определённые условия:

emitter.on('message', (msg) => msg.priority === 'high', (msg) => {
    console.log('Высокий приоритет:', msg.text);
});

Такой подход сокращает количество лишних вызовов обработчиков и повышает производительность.


Встроенные методы управления событиями

  • once – подписчик вызывается один раз и автоматически удаляется после первого события:

    emitter.once('init', () => console.log('Инициализация завершена'));
  • listeners – получение списка всех подписчиков для конкретного события:

    console.log(emitter.listeners('dataChanged'));
  • removeAllListeners – удаление всех подписчиков для одного или всех событий:

    emitter.removeAllListeners('update');
    emitter.removeAllListeners();

Практические сценарии применения

  1. Связь компонентов приложения Система событий позволяет отдельным модулям обмениваться данными без жесткой зависимости друг от друга.

  2. Реактивные интерфейсы Изменения состояния автоматически вызывают обновление UI-компонентов, что особенно удобно при работе с динамическими данными.

  3. Асинхронная обработка данных Подписчики могут запускать асинхронные процессы, такие как запросы к серверу или операции с базой данных, при наступлении определённых событий.


Рекомендации по оптимизации

  • Удалять подписчиков после завершения работы, чтобы избежать утечек памяти.
  • Использовать фильтры для обработки только нужных событий.
  • Для интенсивных операций применять асинхронные события, чтобы не блокировать основной поток.

Система событий и подписок Mind.js обеспечивает надежную основу для построения масштабируемых, реактивных приложений, где отдельные компоненты могут взаимодействовать гибко и безопасно, минимизируя прямые зависимости между ними.