function pubsub(){
var events = {};
var self = this;
self.on = registerEvent;
self.emit = triggerEvent;
function registerEvent(eventName,eventCb){
if(events[eventName] === undefined){
events[eventName] = {
'counter' : 0,
'subscribers': {},
'length' : 0
}
}
var counter = events[eventName].counter++;
events[eventName].subscribers[counter] = eventCb;
events[eventName].length = Object.keys(events[eventName].subscribers).length;
var unsubscribeObj = unsubscribe.bind(eventName,counter);
return {'unsubscribe':unsubscribeObj};
}
function triggerEvent(eventName,param){
if(events[eventName] !== undefined && events[eventName].length){
var eventList = Object.keys(events[eventName].subscribers);
for(var index in eventList){
var eventKey = eventList[index];
events[eventName].subscribers[eventKey].apply({},param);
}
}
}
function unsubscribe(eventName,counter){
if(events[eventName].subscribers[counter] !== undefined){
delete events[eventName].subscribers[counter];
events[eventName].length = Object.keys(events[eventName].subscribers).length;
}else{
console.warn("Event not subscribed");
}
}
}
我正在尝试编写一个pubsub程序。一切正常,除了 取消订阅功能。
var unsubscribeObj = unsubscribe.bind(eventName,counter);
return {'unsubscribe':unsubscribeObj};
取消订阅我传递的参数抛出了bind,但是当它从外面调用时它不起作用。
var pObj = new pubsub(); // Works Fine
var e1 = pObj.on('event1',function(data){ alert(data); });
pObj.emit('event1',["hi"]);
e1.unsubscribe()
未捕获的TypeError:无法读取未定义的属性“订阅者”
答案 0 :(得分:3)
bind
的第一个参数是调用原始函数时用作this
的值;调用它的参数是之后的。这一行
var unsubscribeObj = unsubscribe.bind(eventName,counter);
创建一个函数,使用this
调用eventName
和counter
作为第一个参数。但是,unsubscribe
期望eventName
为第一个参数,counter
为第二个参数。
如果您希望eventName
和counter
参数都是参数,请将不同的第一个参数传递给bind
。如果您不关心this
中unsubscribe
的内容,null
通常是您选择的内容:
var unsubscribeObj = unsubscribe.bind(null, eventName, counter);
答案 1 :(得分:0)
您需要在比较之前检查父属性是否存在。
Element
这是因为这个错误:
CollectionType.Generator.Element
由于function unsubscribe(eventName,counter){
if(events[eventName] && events[eventName].subscribers[counter] !== undefined){
//---^^^^^^^^^^^^^^^^^^^^
delete events[eventName].subscribers[counter];
events[eventName].length = Object.keys(events[eventName].subscribers).length;
}else{
console.warn("Event not subscribed");
}
}
未定义而生成,因此Uncaught TypeError: Cannot read property 'subscribers' of undefined
不存在。
您可以避免此更改时出现错误。
答案 2 :(得分:0)
如果你想绑定上下文,你应该这样做:
var unsubscribeObj = unsubscribe.bind(this);
return {'unsubscribe':unsubscribeObj(eventName,counter)};