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};
구독 취소에 나는 인수가 바인드를 던졌지 만 외부에서 호출 할 때 작동하지 않습니다.
var pObj = new pubsub(); // Works Fine
var e1 = pObj.on('event1',function(data){ alert(data); });
pObj.emit('event1',["hi"]);
e1.unsubscribe()
포착되지 않은 TypeError : 정의되지 않은 '구독자'속성을 읽을 수 없습니다.
의 첫 번째 인수 는 원래 함수를 호출 할 때 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);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다