Как бы вы переписали этот код
vanished
|
vanished
|
В методе emit есть ошибка. Перед тем как пробегать по обработчикам и запускать их события надо сначала сделать копию массива обработчиков, в противном случае, если в одном из обработчиков будут добавляться/удаляться обработчики, то все может сломаться.
|
Ну и обычно делаю чтобы метод отписки мог работать и без параметров, в этом случае должны удаляться все обработчики. Очень удобно когда надо грохнуть целую вьюху со всеми обработчиками. Ну и очень круто сделали ребята в бэкбоне. Идея методов listenTo и stopListening - шикарна.
|
https://github.com/tsigel/BaseClass/...er/src/Base.ts
Там есть поддержка событий через ":", и тестики. |
vanished
|
GayCoder,
Допустим у меня есть 4 обработчика на 1 событии. Во втором обработчике я вешаю ещё 3 обработчика на это же событие. То есть массив по которому вы бежите изменится в момент выполнения одного из обработчиков. Как раз из-за того что js однопоточен, как вы верно заметили. Но если добавлять - то все хорошо, а если удалять - то всему конец. Если я в обработчике отпишу следующий обработчик, то индекс собъется и пойдут трудно отлавливаемые баги. |
Цитата:
|
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 не отработал вовсе, а обработчик который мы навесили во время события добавился, хотя должен был работать только со следующего события. Обработчики события не должны влиять на работу ТЕКУЩЕГО события, они должны влиять на последующие за событием поведение. |
vanished
|
Часовой пояс GMT +3, время: 09:14. |