@sodiqit

Как правильно передать параметры в функцию-обработчик чтобы потом его можно было удалить?

Всем привет! Вопрос состоит в том, как передать параметры в функцию-обработчик, чтобы впоследствии удалить её через removeEventListener?

Сейчас у меня такая ситуация:
const curry = function(i) {
  return (e) => changeCountry(e, i);
}; 
button.addEventListener('click', curry(i));

Но как в данном случае удалить обработчик? Ведь получается, что им является анонимная функция, которую нельзя удалить и она останется висеть.
  • Вопрос задан
  • 842 просмотра
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
На моей практике лучшим методом работой с различными EventEmitter/PubSub механизмами - это подписыватель возвращающий отписыватель. То есть некая функция, которая на основе своих аргументов организует подписку и возвращает функцию без аргументов, которая при вызове отменит подписку, отпишет от события и т.д.
Пример из личной библиотеки:
import {curry} from 'ramda';
export const subscribe = curry((target: EventTarget, eventName: string, handler: EventListenerOrEventListenerObject): (() => void) => {
    target.addEventListener(eventName, handler);
    return () => target.removeEventListener(eventName, handler);
});

Если убрать ramda и typescript, то останется такое:
export const subscribe = (target, eventName, handler) => {
    target.addEventListener(eventName, handler);
    return () => target.removeEventListener(eventName, handler);
};

Суть: subscribe при вызове подпишет DOM объект target на событие eventName с функцией handler и вернет функцию без аргументов, которая при вызове отпишет DOM объект target от события eventName для функции handler

В Вашем случае будет так:
const curry = (i) => (e) => changeCountry(e, i);
const unsubscribe = subscribe(button, 'click', curry(i));
// когда подписка больше не нужна, просто вызываем unsubscribe()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
zkrvndm
@zkrvndm
Архитектор решений
Знаете, лично я бы не стал возится с удалением обработчиков, так как это тот ещё геморрой иногда. Лучший вариант, это просто добавить выключатель внутрь запускаемой функции. Например, вот так:
status = 1;
button.addEventListener('click', function() {
    if (status) {
        test();
    }
});

Соответственно, когда обработчик вам больше не нужен, просто меняете переменную status на ноль и целевая функция test уже больше не будет запускаться при срабатывании обработчика.
Ответ написан
Комментировать
sf-002
@sf-002
Учу JS
function sum(a, b) {
        console.log(a + b);
    }
    let temp;
    window.addEventListener('scroll', temp = () => sum(3, 4));
    window.removeEventListener('scroll', temp);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы