написал простенький 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();