var emitter = {
// Свойство в котором хранятся все события.
subscriptions: {},
// Подписывает на событие. На любое событие подписчик может
// подписаться неограниченное количество раз.
on: function (event, subscriber, handler) {
if (!this.subscriptions.hasOwnProperty(event)) {
this.subscriptions[event] = [];
}
this.subscriptions[event].push({
subscriber: subscriber,
handler: handler
});
return this;
},
// Отписывает от события подписчика. После отписки, при возникновении
// данного события, никаких обработчиков, связанных с этим подписчиком,
// не должно быть вызвано. Есть возможность повторно подписаться и снова
//получать события.
off: function (event, subscriber) {
if (this.subscriptions.hasOwnProperty(event)) {
delete this.subscriptions[event]
}
return this;
},
//Оповещение всех подписчиков (не отписавшихся). Вызывает все функции-
//обработчики в порядке подписки.
emit: function (event) {
for (let i = 0; i < this.subscriptions[event].length; i++) {
this.subscriptions[event][i].handler();
}
return this;
}
};
// Определим объект для счетчика нотификаций
var notifications = {
counter: 0,
count: function () {
this.counter++;
}
};
// Определим объект для хранения логов
var logger = {
logs: []
};
Сейчас, если вызвать
emitter
.on('new_notification', notifications, notifications.count)
.on('new_notification', logger, function () {
this.logs.push('Произошло новое событие new_notification');
})
.on('new_notification', logger, function () {
// this указывает на logger
this.logs.push('Добавлено. Количество - ' + notifications.counter);
})
.emit('new_notification');
То переменные notifications и logger не изменятся.
Нужно, чтобы при вызове emitter.on, emitter.off, emitter.emit он изменял переменные notifications и logger, в чем проблема заключается?
Менять можно только объект emitter.
Вот так возникает ошибка с notifications.counter
emitter
.on('new_notification', notifications, notifications.count)
.on('new_notification', logger, function () {
this.logs.push('Произошло новое событие new_notification');
})
.on('new_notification', logger, function () {
// this указывает на logger
this.logs.push('Добавлена новая нотификация. Количество - ' + notifications.counter);
})
.emit('new_notification')
//На время отключаем логирование, а затем опять включаем
.off('new_notification', logger)
.emit('new_notification')
.on('new_notification', logger, function () {
this.logs.push('Новое событие new_notification!');
})
.emit('new_notification');
this.subscriptions[event].push({
subscriber: subscriber,
handler: handler.bind(subscriber) // handler will be called in the context of subscriber
});
Update:
у Вас неправильная логика в методе off
- Вы не используете второй параметр, а удаляете всех, кто подписан на данное событие.
Виртуальный выделенный сервер (VDS) становится отличным выбором
У меня есть popup окно с id="hidden-content"Мне нужно чтобы это окно открывалось при переходе по ссылке http://мойсайт/#hidden-content
Здравствуйте делаю счетчик обратного отсчета , суть счетчика заключается в том чтобы отсчитывать ровно 1 час и выполнять определенное действиевремя...