На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ElcnU, ANDLL, fatalist
  
> EventEmitter , мучу свой эмиттер
    Добре, следуший код не работает! :wacko:
    ExpandedWrap disabled
      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!'); // выхлопа нет

    ошибок нет, но и выхлопа тоже :D
    Сообщение отредактировано: Cfon -
      нашел баг :D
      как оказалось я вставлял элементы в локальный массив event :huh:, исправил баг теперь все пучком :D
      ExpandedWrap disabled
        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! :D
      на литералах объектов уже никто не работает :D
      ExpandedWrap disabled
        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));
                }
            }
        })();
      Сообщение отредактировано: Cfon -
        эх гулять так гулять! :D
        ExpandedWrap disabled
          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));
                  }
              }
          })();
        Сообщение отредактировано: Cfon -
          есть вопрос, будет ли утечка памяти в последнем примере EventEmitter
          насколько я понял про WeakMap, слабыми у него являются только ключи-объекты, а значения-объекты нет.
          ExpandedWrap disabled
            const MyEventEmitter = (() => {
                const properties = new WeakMap();
                return class {  
                    constructor() {        
                        properties.set(this, { events: new Map()}); //<-- вот тут
                    }
                    ...
                }
            })();

          если есть утечка, то как ее переодолеть? :huh:
          Сообщение отредактировано: Cfon -
            А что ты подразумеваешь под утечкой?

            Утечка - это циклический референс сам на себя, например (и то, хромовский gc вполне себе умеет детектить такое, вроде даже сквозные циклические ссылки). Тут оно есть?
            Ну или бесконтрольное создание объектов и владение ими всеми сразу. Тут оно есть?
              Цитата Serafim @
              А что ты подразумеваешь под утечкой?

              Утечка - это циклический референс сам на себя, например (и то, хромовский gc вполне себе умеет детектить такое, вроде даже сквозные циклические ссылки). Тут оно есть?
              Ну или бесконтрольное создание объектов и владение ими всеми сразу. Тут оно есть?

              дружище не парь мне моск :D
              память выделенная под events освобождается или как?

              Симсона знаешь? нет не читал? :D
              Вот цитата из его книжки "Ваще не знаешь Жаваскрипт: Иди учи ES6, ну или ES8" :lool:
              Цитата
              It’s important to note that a WeakMap only holds its keys weakly, not its values. Consider:
              ExpandedWrap disabled
                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".
              Сообщение отредактировано: Cfon -
                посмотрел несколько полифилов WeakMap, все реализованы приблизительно одинаково и основаны на модификации объекта key, в котором создаётся уникальное свойство со значением value.
                отсюда делаю вывод, что при key=null объект сохранённый в value также будет убран GC.
                что имел ввиду многоуважаемый Кайло Симпсон в своей книжке хз :D

                возможно имелось ввиду что только при key=null будет удалёна пара key/value, но не при value=null.
                Сообщение отредактировано: Cfon -
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0273 ]   [ 16 queries used ]   [ Generated: 28.03.24, 10:01 GMT ]