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(); |
У вас, когда step выполняется по вызову из _RunEvents (как обработчик события), он сразу добавляет ещё один обработчик на событие complete. Соответственно, в списке обработчиков на событие их уже 2. Поэтому, когда происходит следующая итерация (++i), то начинает выполняться второй (только что добавленный) обработчик. И так далее до пяти обработчиков в списке.
|
Часовой пояс GMT +3, время: 12:42. |