Источник события removeEventListener не удаляет событие

#javascript #server-sent-events

Вопрос:

У меня есть следующий код для EventSource объекта :

 var sse = {};(function(s){

var es = { sseinit:false },
    handle = function(){};

s.init = function (url) {
    if (es.sseinit !== undefined) {
        // condition for compilation error
        es = typeof EventSource === 'function' || typeof EventSource === 'object' ?new EventSource(url) :{};
    }
};

s.close = function () {
    if (es.sseinit === undefined) {
        es.close();
        es = { sseinit:false };
    }
};

s.addEventListener = function (name,callback) {
    handle = function(e) {
        callback(e,JSON.parse(e.data));
    };
    console.log('addEventListener :: ' name);
    es.addEventListener(name,handle);
};

s.removeEventListener = function (name) {
    if (es.sseinit !== false) {
        console.log('removeEventListener :: ' name);
        es.removeEventListener(name,handle);
    }
};}(sse));
 

Когда мы вызываем es.removeEventListener событие, оно не удаляется, как removeEventListener не существует для EventSource объекта.

Ответ №1:

Я обнаружил, что это эталонная проблема

var sse = {}; (функция(функции){

 var es = { sseinit:false };

s.init = function (url) {
    if (es.sseinit !== undefined) {
        es = typeof EventSource === 'function' || typeof EventSource === 'object' ?new EventSource(url) :{};
    }
};

s.close = function () {
    if (es.sseinit === undefined) {
        es.close();
        es = { sseinit:false };
    }
};

s.addEventListener = function (name,callback) {
    this['handle' name] = function(e) {
        callback(e,JSON.parse(e.data));
    };
    es.addEventListener(name,this['handle' name]);
};

s.removeEventListener = function (name) {
    if (es.sseinit !== false) {
        es.removeEventListener(name,this['handle' name]);
    }
}; }(sse))
 

Я использовал «это[‘дескриптор’ имя]», чтобы сохранить контекст для определения функции дескриптора.