Пользовательские события Javascript с подстановочными знаками (*) - PullRequest
2 голосов
/ 26 июля 2011

Я делаю объект pub / sub для пользовательских событий, и я не могу понять, как добавить поддержку таких событий, как user.logged.*, где бы подписчик подписывался на события user.logged.in и user.logged.out

Существуют ли какие-либо ресурсы, из-за которых Google не может помочь.

РЕДАКТИРОВАТЬ

Возможно, в моей функции подписки я должен проверить пропущенный тип события для подстановочных знаков и подписаться насобытия?

Ответы [ 3 ]

3 голосов
/ 26 июля 2011

Я бы ограничил это только последней частью подстановочным знаком.Тогда trigger будет выглядеть как

function trigger(name, data) {
    var parts = name.split('.');
    for(var i = 0; i < parts.length; i++) {
        call_subscribers(parts.slice(0, i).join('.'), data, parts.slice(i+1));
    }
}

function call_subscribers(event_name, data, remaining_event_parts) {
    for(var subscriberIndex in subscribers[event_name]) {
        subscribers[subscriberIndex](data, remaining_event_parts);
    }
}

На этом тесте вы будете делать

subscribers = [];
subscribers['user.logged'] = [
    function(data) { // here, we dont care about the remaining parts
        // do what you have to do
    }
];
trigger('user.logged.in'); // calls 'user', 
                          //'user.logged' (the wildcard we want) and 
                          // 'user.logged.in'

Затем вы можете зарегистрировать события user, user.logged и user.logged.in.И будет эффективно получить иерархию событий.После того, как остальная часть события будет передана обработчику, вы, возможно, тоже сможете делать забавные вещи ...

2 голосов
/ 26 июля 2011

Если у вас есть список событий в какой-то коллекции вроде этого:

var events = ["user.logged.in", 
              "user.logged.out", 
              "user.disconnect", 
              "system.disconnect"
              // etc etc etc
             ];

Затем, когда сущность подписывается на «user.logged. *», Вы можете сделать сравнение частей следующим образом:

function subscribe(evt) {
    var evtParts = evt.split("."),
        eventParts, eventIdx, ii, subscribeTo = [];

    for (eventIdx = 0; eventIdx < events.length; eventIdx += 1) {
        eventParts = events[eventIdx].split(".");

        for (ii = 0; ii < eventParts.length && ii < evtParts.length; ii += 1) {
            if (evtParts[ii] == "*") {
                subscribeTo.push(events[eventIdx]);
            }
            else if (eventParts[ii] == evtParts[ii] && ii == evtParts.length - 1) {
                subscribeTo.push(events[eventIdx]);
            }
            else if (eventParts[ii] != evtParts[ii]) {
                break;
            }
        }
    }

    // Now, subscribeTo contains all the events that match evt, 
    // even when evt contains a wildcard.
}
0 голосов
/ 05 июля 2016

Немного поздно, но вы можете взглянуть на EventEmitter2: https://github.com/asyncly/EventEmitter2

server.on('foo.*', function(value1, value2) {
  console.log(this.event, value1, value2);
});
...