Mind.js предоставляет мощный механизм для организации событийной модели и управления потоками данных внутри приложений. Система событий основана на концепции наблюдателя (observer) и позволяет создавать подписки на изменения состояния объектов, что делает код гибким и легко масштабируемым.
Emitter Центральный элемент событийной системы —
объект, способный генерировать события. В Mind.js это реализуется через
класс EventEmitter. Каждый Emitter
поддерживает:
Пример создания объекта-эмиттера:
const { EventEmitter } = require('mind.js');
const emitter = new EventEmitter();Подписчик (Listener) Подписчик — это функция, которая вызывается при наступлении события. Она получает объект с данными события и может выполнять любые действия.
Регистрация подписчика выполняется методом on:
emitter.on('dataChanged', (data) => {
console.log('Новое значение:', data);
});Удаление подписчиков Для предотвращения утечек
памяти и контроля над подписками используется метод
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();Связь компонентов приложения Система событий позволяет отдельным модулям обмениваться данными без жесткой зависимости друг от друга.
Реактивные интерфейсы Изменения состояния автоматически вызывают обновление UI-компонентов, что особенно удобно при работе с динамическими данными.
Асинхронная обработка данных Подписчики могут запускать асинхронные процессы, такие как запросы к серверу или операции с базой данных, при наступлении определённых событий.
Система событий и подписок Mind.js обеспечивает надежную основу для построения масштабируемых, реактивных приложений, где отдельные компоненты могут взаимодействовать гибко и безопасно, минимизируя прямые зависимости между ними.