Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.05.2014, 20:39
Новичок на форуме
Отправить личное сообщение для avips Посмотреть профиль Найти все сообщения от avips
 
Регистрация: 27.05.2014
Сообщений: 1

Observer в javascript
написал простенький observer в javascript, но заметил какое то непонятное для меня поведение. В нижеприведенном коде, если один раз вызвать RunEvents, а потом просто добавлять новые коллбэки на то же событие, то они автоматом почему-то выполняются.
Кто нибудь подскажет - почему так происходит, и как сделать правильно?
В приведенном коде сначала вызывается функция step, которая регистрирует себя же на событие complete, только при первом вызове вызывается RunOperation, который эмулирует длительную операцию, и вызывает потом событие complete.

var Observer = (function () {
    var EventCallbacks = {
        "complete": []
    };

    function _RunEvents(eventId, eventParams) {
        _Log("_RunEvents " + eventId + " " + EventCallbacks[eventId].length);
        for (var i = 0; i < EventCallbacks[eventId].length; i++) {
            _Log("callback: " + EventCallbacks[eventId][i]);
            EventCallbacks[eventId][i](eventParams);
        }
        EventCallbacks[eventId] = [];
    }

    function _AddEventReceiver(eventId, callback) {
        EventCallbacks[eventId].push(callback);
    }
    
    // public methods
    return {
        AddEventReceiver: function (eventId, callback) {
            _AddEventReceiver(eventId, callback);
        },
        RunEvents: function (eventId, eventParams) {
            _Log("run events public");
            _RunEvents(eventId, eventParams);
        }
    }
} ());


function _Log(message) {
    if (!console)
        return;
    console.log(message);
}

function RunOperation() {
    _Log("run operation");
    setTimeout(function () { Observer.RunEvents("complete") }, 2000);
}

var cnt = 0;

function step() {
    if (cnt > 5)
        return;
    _Log("run step, cnt = " + cnt);
    Observer.AddEventReceiver("complete", step);
    if (cnt == 0)
        RunOperation();
    cnt++;
}

step();
Ответить с цитированием
  #2 (permalink)  
Старый 27.05.2014, 21:19
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

У вас, когда step выполняется по вызову из _RunEvents (как обработчик события), он сразу добавляет ещё один обработчик на событие complete. Соответственно, в списке обработчиков на событие их уже 2. Поэтому, когда происходит следующая итерация (++i), то начинает выполняться второй (только что добавленный) обработчик. И так далее до пяти обработчиков в списке.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книга: JavaScript. Сильные стороны Magneto Учебные материалы 16 21.04.2013 15:28
Интерпретатор Java на JS kobezzza Оффтопик 24 11.10.2012 18:32
Первый Moscow JavaScript Meetup korenyushkin Общие вопросы Javascript 0 26.07.2011 15:23
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34