JavaScript. Не обновляется значение объектов notification и logger

215
20 февраля 2018, 08:33
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');
Answer 1
this.subscriptions[event].push({
  subscriber: subscriber,
  handler: handler.bind(subscriber) // handler will be called in the context of subscriber
});

Update:

у Вас неправильная логика в методе off - Вы не используете второй параметр, а удаляете всех, кто подписан на данное событие.

READ ALSO
Как запускать popup fancybox по прямой ссылке?

Как запускать popup fancybox по прямой ссылке?

У меня есть popup окно с id="hidden-content"Мне нужно чтобы это окно открывалось при переходе по ссылке http://мойсайт/#hidden-content

258
Таймер обратного отсчета с временем из БД и занесением данных в БД каждый час

Таймер обратного отсчета с временем из БД и занесением данных в БД каждый час

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

231
Node JS, return из модуля

Node JS, return из модуля

Добрый деньЯ новичок в Node , сильно не критикуйте

226