Nano Hash - криптовалюты, майнинг, программирование

Пользовательские события (шаблон наблюдателя)

Не могу найти как это реализовать (извиняюсь за фристайл запись):

//assign the event handler for the object "myObj"     
myObj.onMyEvent = //do something

//if something happened somewhere, then run the event
MyEvent.fire();

Идея в том, что мы вызываем (генерируем) какое-то пользовательское событие (MyEvent). У нас есть объект «myObj», который способен распознавать возникновение «MyEvent» и как-то (по-своему) реагировать на него. Кроме того, у нас есть другие объекты (разного рода), которые (по-своему) реагируют на "MyEvent".

Я знаю, что есть "шаблон наблюдателя", но не могу найти конкретную реализацию.

Не подскажете, где об этом почитать? Или в природе это вообще невозможно? Или это делается совсем по другому?

Обновление 1: никаких JS-библиотек, пожалуйста (jQuery, Prototype, YUI,...)


  • Это, вероятно, слишком расплывчато, чтобы получить полезные ответы. В общем, шаблон наблюдателя прост в реализации, и существует множество источников, которые полностью его объясняют (включая Википедию. Я бы также рекомендовал «Шаблоны проектирования Head First» от Freeman и Freeman. В противном случае просто погуглите.) 16.12.2010
  • @Jake «Шаблоны проектирования Head First» ориентирован на java и, следовательно, не очень помогает javascript. Внутреннее устройство совершенно другое. 16.12.2010

Ответы:


1

никаких JS-библиотек, пожалуйста (jQuery, Prototype, YUI,...)

Я бы серьезно переосмыслил это требование. Все эти библиотеки много раз решали эту или подобные проблемы.

Но если вы хотите начать с нуля, сделайте что-то вроде этого:

window.customEvents = {
    handlers : {
        foo:[],
        bar:[],
        baz:[]
    },

    registerEventHandler:function(event, object, handler){
       if(typeof(customEvents.handlers[event])=="undefined")
           customEvents.handlers[event]=[]; 
       customEvents.handlers[event].push([object, handler]);
    },

    fireEvent:function(eventName, data){
        if(customEvents.handlers[event]){
            for(var i = 0; i < customEvents.handlers[event].length; i++){
                var handlerPair = customEvents.handlers[event][i];
                handlerPair[1](handlerPair[0], data);
            }
        }
    },

}

Применение:

// register event handler
customEvents.registerEventHandler(eventName, targetObject, handlerFunction)

// fire event
customEvents.fireEvent(eventName, data)

// handlerFunction will be passed two parameters: targetObject and event data
16.12.2010

2

Мое решение:

var customEvents = {
            _handlers : {},

            subscribe: function(event, handler){
               if(typeof(this._handlers[event])=="undefined")
                   this._handlers[event]=[]; 
               this._handlers[event].push(handler);
            },

            fire:function(event, data){
                if(this._handlers[event]){
                    for(var i = 0; i < this._handlers[event].length; i++){
                        this._handlers[event][i](data);
                    }
                }
            }
    };


var myObj1 = new function(){
        this.handler = function(data){
            console.log(data+'1');
        };
        customEvents.subscribe("greatEvent", this.handler);
    };  



var myObj2 = new function(){
        this.handler = function(data){
            console.log(data+'2');
        };
        customEvents.subscribe("greatEvent", this.handler);
    };  


//if something happened somewhere, then run the event
customEvents.fire("greatEvent", 'ta-da');
16.12.2010
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..