带有通配符(*)的Javascript自定义事件
我正在为自定义事件创建一个pub/sub对象,但我不知道如何添加对事件的支持,例如带有通配符(*)的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
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,它会有什么意义呢?希望您能够同时触发两个事件?我知道如果发生任何事件,你想触发另一个函数?