Эмитент событий с условиями - PullRequest
1 голос
/ 22 марта 2019

Я создал класс генератора событий.Работает нормально.Позвольте мне рассказать вам, как:

Это класс:

class EventEmitter{

    constructor() {
        this.events = {};
    }

    on(eventName,callback) {
        if(this.events[eventName]) {
            this.events[eventName].push(callback);
        } else {
            this.events[eventName] = [callback]; 
        }
    }

    trigger(eventName, ...rest) {
        if(this.events[eventName]) {
            this.events[eventName].forEach(cb => {
                cb.apply(null,rest); 
            });
        }
    }
 }

С этим классом я могу слушать определенные события.Вот так:

 const ee = new EventEmitter();
 ee.on('change', (aa) => {
     console.log(aa);
 });

Тогда я могу запустить его с помощью метода триггера

 ee.trigger('change','Argument');

Теперь я хочу прослушать события с определенными условиями.

например:

 ee.on({'change': 'barack the boss'}, (aa) => {
     console.log(aa);
 });

Приведенный выше фрагмент кода должен выполняться только тогда, когда триггер выглядит следующим образом:

 //wont run
 ee.trigger('change','barack is no boss');
//will run
 ee.trigger('change','barack the boss');

Интересно, как это сделать.Я не прошу вас писать мой код, мне нужен пример или шаг в правильном направлении.

Заранее спасибо.

Весь код:

class EventEmitter{

    constructor() {
        this.events = {};
    }

    on(eventName,callback) {
        if(this.events[eventName]) {
            this.events[eventName].push(callback);
        } else {
            this.events[eventName] = [callback]; 
        }
    }

    trigger(eventName, ...rest) {
        if(this.events[eventName]) {
            this.events[eventName].forEach(cb => {
                cb.apply(null,rest); 
            });
        }
    }
 }

//events has been created and is currently an empty object
 const ee = new EventEmitter();

//even has been created, this event has a function which will be executed when event is triggered
 ee.on({'change': 'barack the boss'}, (aa) => {
     console.log(aa);
 });

 //wont run
 ee.trigger('change','barack is no boss');
//will run
 ee.trigger('change','barack the boss');

1 Ответ

1 голос
/ 22 марта 2019

Я бы использовал Object.Keys в регистре событий .on(). Это позволит вам выполнять итерации по переданному объекту (что в то же время даст вам возможность зарегистрировать несколько событий за один вызов).

С Object.Keys вы можете перебирать объект аргумента, как если бы он был массивом. Затем вы можете зарегистрировать значение ключа в качестве условия при запуске события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...