Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有通配符(*)的Javascript自定义事件_Javascript_Publish Subscribe_Observer Pattern - Fatal编程技术网

带有通配符(*)的Javascript自定义事件

带有通配符(*)的Javascript自定义事件,javascript,publish-subscribe,observer-pattern,Javascript,Publish Subscribe,Observer Pattern,我正在为自定义事件创建一个pub/sub对象,但我不知道如何添加对事件的支持,例如user.logged.*它将向订阅方订阅事件user.logged.in和user.logged.out 有没有什么资源是谷歌帮不上忙的 编辑 也许在我的subscribe函数中,我应该检查传递的事件类型是否有通配符,并订阅这两个事件?我会将其限制为仅最后一部分为通配符。然后,trigger看起来像 function trigger(name, data) { var parts = name.split

我正在为自定义事件创建一个pub/sub对象,但我不知道如何添加对事件的支持,例如
user.logged.*
它将向订阅方订阅事件
user.logged.in
user.logged.out

有没有什么资源是谷歌帮不上忙的

编辑


也许在我的subscribe函数中,我应该检查传递的事件类型是否有通配符,并订阅这两个事件?

我会将其限制为仅最后一部分为通配符。然后,
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);
    }
}

然后,您可以注册事件
user
user.logged
user.logged.in
。并将有效地获得事件层次结构。将事件的其余部分传递给处理程序后,您可能还可以做一些有趣的事情……

如果您将事件列表保存在类似以下的集合中:

var events = ["user.logged.in", 
              "user.logged.out", 
              "user.disconnect", 
              "system.disconnect"
              // etc etc etc
             ];
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.
}
然后,当实体订阅“user.logged.*”时,您可以对以下部分进行比较:

var events = ["user.logged.in", 
              "user.logged.out", 
              "user.disconnect", 
              "system.disconnect"
              // etc etc etc
             ];
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.
}
函数订阅(evt){
var evtParts=evt.split(“.”),
eventParts,eventIdx,ii,subscribeTo=[];
对于(eventIdx=0;eventIdx
有点晚了,但您可以看看EventEmitter2:


你能解释一下call_subscribers()的3个参数吗?如果名称为“user.logged.*”它将如何注册“user.logged.in”?更新,第一个是被触发事件的名称,第二个是从外部传入的数据,最后一部分是实际调用的事件名称的其余部分。在哪里切换是指触发器?如果我传递触发器(“user.logged.*”)它将把“*”注册为事件类型吗?是的,但是如果我们同时触发logged.in和logged.out,它会有什么意义呢?希望您能够同时触发两个事件?我知道如果发生任何事件,你想触发另一个函数?