Показать сообщение отдельно
  #9 (permalink)  
Старый 29.01.2016, 09:02
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

var EventEmiter = {
    _handlers: [],
    on: function (handler) {
        this._handlers.push(handler);
    },
    off: function (handler) {
        this._handlers.splice(this._handlers.indexOf(handler), 1);
    },
    emit: function () {
        this._handlers.forEach(function (handler) {
            handler();
        });
    }
};

var handler4 = function () {
    console.log(4);
};

EventEmiter.on(function () {
    console.log(1);
});

EventEmiter.on(function () {
    console.log(2);
    EventEmiter.on(function () {
        console.log('Добавил в цикле, не долже проиграться во время текущего события!');
    });
});

EventEmiter.on(function () {
    console.log(3);
    EventEmiter.off(handler4);
});

EventEmiter.on(handler4);

EventEmiter.on(function () {
    console.log(5);
});

EventEmiter.on(function () {
    console.log(6);
});

EventEmiter.emit();


Вот простейшая реализация без копирования массива. Как вы видите обработчик 4 не отработал вовсе, а обработчик который мы навесили во время события добавился, хотя должен был работать только со следующего события.

Обработчики события не должны влиять на работу ТЕКУЩЕГО события, они должны влиять на последующие за событием поведение.

Последний раз редактировалось tsigel, 29.01.2016 в 09:06.
Ответить с цитированием