Как вы помните из страницы про логирование системные события могут передавать параметры первым не строчным элементом.
/* Тэги задаются как #camelCaseWord и служат для дальнейшей фильтрации сообщений в логгере */
/** ВАЖНО: системные события должны содержать в себе настоящий объект с данными для последующей обработки */
console.log('#money, #input', {amount: 20})
Существует системный сервис EventsService который занимается тем что слушает поток логов и оповещает подписчиков о событиях.
Для теста я заставил биллВалидатор слать сообщения о внесённой сумме каждые 500мс, а сообщение об открытии кассеты - каждые 5 секунд.
И вот пример кода который показывает как этим пользоваться на примере простейшего сервиса инкасации:
// Просим Домен запустить сервис Events. Сервис всегда является синглтоном.
// Если он уже запущен - вернётся ссылка на уже запущенный.
Domain.SvcDomain.startService('Events', function (svc) {
// переменная в которой мы будем считать сумму внесённых денег
var count = 0;
// сервис events реализует метод подписки subscribe, который принимает на вход объект
svc.subscribe({
// содержащий ключ listen в который можно передать подписчика объектом или массив подписчиков
listen: [{
// event передаётся первый аргумент callback функции. Можно не указывать если не требуется разделение
event: 'billInsert',
// NameSpace логирования
namespace: 'Devices.BillValidator',
// тэги по которым фильтруются сообщения.
// Несколько элементов работают как AND, то есть должны присутствовать одновременно все.
// если не указать, то будут падать все сообщения из NameSpace
filter: ['bill']
}, {
event: 'incasation',
namespace: 'Devices.BillValidator',
filter: ['incasation']
}],
// поле fn - callback функция которая будет вызвана при соответствии сообщения фильтрам
fn: function (
// поле event подошедшего подписчика
event,
/* второй аргумент - первый не строчный элемент из console.log
Осторожно, это накладывает некоторое ограничение логирование хлама в системных событиях */
info,
// Идущие далее аргументы несут в себе дополнительную информацию и обычно не будут использованы.
// третий - объект со всеми найденными тегами в текущем сообщении (тэги - ключи объекта)
matched,
// четвёртый - объект подписчика из listen, прошедший фильтрацию. Можно использовать для хранения состояния.
listener,
// пятый - весь LogObject. Содержит всю информацию связанную с текущим сообщением. Лучше не использовать.
logObject
) {
// this - весь подписавшийся объект
if(event === 'billInsert') {
/* если event подписчика соответствет billInsert ->
прибавляем к сумме amount из первого не строчного элемента */
count += info.amount;
}else if(event === 'incasation'){
/* если же произошла инкасация - обнуляем сумму */
console.log('#incasationService #moneyStackEmpty', count);
count = 0;
}
console.log('#incasationService #amount', count);
}
});
});