Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.15.241.105] |
|
Сообщ.
#1
,
|
|
|
Добре, следуший код не работает!
const MyEventEmitter = (() => { const _events = Symbol(); return class { constructor() { this[_events] = {}; } onEvent(name, func) { const event = this[_events][name] || []; event.push(func); } emit(name, data) { const event = this[_events][name]; event && event.forEach(func => func(data)); } } })(); // test const myemt = new MyEventEmitter(); myemt.onEvent('onhello', data => console.log(data)); myemt.onEvent('onhello', data => console.log(data)); myemt.onEvent('onhello', data => console.log(data)); myemt.emit('onhello', 'Hello!'); // выхлопа нет ошибок нет, но и выхлопа тоже |
Сообщ.
#2
,
|
|
|
нашел баг
как оказалось я вставлял элементы в локальный массив event , исправил баг теперь все пучком const MyEventEmitter = (() => { const _events = Symbol(); return class { constructor() { this[_events] = {}; } onEvent(name, func) { // const event = this[_events][name] || []; //<-- event всегда инициализируется пустым массивом, никак не связан с this[_events][name]! // event.push(func); //<-- затем вставляю в него функцию. // ЭТО ОШИБКА ЛОГИКИ! // НИЖЕ ПРАВИЛЬНОЕ РЕШЕНИЕ this[_events][name] = this[_events][name] || []; this[_events][name].push(func); } emit(name, data) { const event = this[_events][name]; event && event.forEach(func => func(data)); } } })(); Добавлено продолжаю разминать моск, переделал на мапе на дворе ж конец 2017! на литералах объектов уже никто не работает const MyEventEmitter = (() => { const _events = Symbol(); return class { constructor() { this[_events] = new Map(); } onEvent(name, func) { const funcs = this[_events].get(name) || []; funcs.push(func); this[_events].set(name, funcs); } emit(name, data) { const funcs = this[_events].get(name); funcs && funcs.forEach(func => func(data)); } } })(); |
Сообщ.
#3
,
|
|
|
эх гулять так гулять!
const MyEventEmitter = (() => { const properties = new WeakMap(); return class { constructor() { properties.set(this, { events: new Map()}); } onEvent(name, func) { const events = properties.get(this).events; const funcs = events.get(name) || []; funcs.push(func); events.set(name, funcs); } emit(name, data) { const events = properties.get(this).events; const funcs = events.get(name); funcs && funcs.forEach(func => func(data)); } } })(); |
Сообщ.
#4
,
|
|
|
есть вопрос, будет ли утечка памяти в последнем примере EventEmitter
насколько я понял про WeakMap, слабыми у него являются только ключи-объекты, а значения-объекты нет. const MyEventEmitter = (() => { const properties = new WeakMap(); return class { constructor() { properties.set(this, { events: new Map()}); //<-- вот тут } ... } })(); если есть утечка, то как ее переодолеть? |
Сообщ.
#5
,
|
|
|
А что ты подразумеваешь под утечкой?
Утечка - это циклический референс сам на себя, например (и то, хромовский gc вполне себе умеет детектить такое, вроде даже сквозные циклические ссылки). Тут оно есть? Ну или бесконтрольное создание объектов и владение ими всеми сразу. Тут оно есть? |
Сообщ.
#6
,
|
|
|
Цитата Serafim @ А что ты подразумеваешь под утечкой? Утечка - это циклический референс сам на себя, например (и то, хромовский gc вполне себе умеет детектить такое, вроде даже сквозные циклические ссылки). Тут оно есть? Ну или бесконтрольное создание объектов и владение ими всеми сразу. Тут оно есть? дружище не парь мне моск память выделенная под events освобождается или как? Симсона знаешь? нет не читал? Вот цитата из его книжки "Ваще не знаешь Жаваскрипт: Иди учи ES6, ну или ES8" Цитата It’s important to note that a WeakMap only holds its keys weakly, not its values. Consider: var m = new WeakMap(); var x = { id: 1 }, y = { id: 2 }; m.set( x, y ); x = null; // `x` is GC-able y = null; // `y` is not GC-able For this reason, WeakMaps are in my opinion better named "WeakKeyMaps". |
Сообщ.
#7
,
|
|
|
посмотрел несколько полифилов WeakMap, все реализованы приблизительно одинаково и основаны на модификации объекта key, в котором создаётся уникальное свойство со значением value.
отсюда делаю вывод, что при key=null объект сохранённый в value также будет убран GC. что имел ввиду многоуважаемый Кайло Симпсон в своей книжке хз возможно имелось ввиду что только при key=null будет удалёна пара key/value, но не при value=null. |