Я пытаюсь создать оболочку функции, которая может быть вызвана с элементом DOM в качестве аргумента и будет возвращать уникальную функцию, связанную с отклонением, привязанную к этому элементу DOM, в котором есть некоторая логика.
Я объясню свой мыслительный процесс, шаг за шагом:
Вот оригинальная дебаунс-функция
hideElementWhenIdle = _.debounce(($el) => {
if($el.is(":hover"))
hideElementWhenIdle($el);
else
$el.removeClass("visible");
}, 5000);
Теперь эта функция работала отлично, пока я не понял, что привязываю функцию, для которой было выполнено устранение дребезга, к первому элементу, с которым она была вызвана. Итак, если бы я хотел создать:
hideElementWhenIdle( $("selector-1") );
hideElementWhenIdle( $("selector-2") );
они в основном осуждали друг друга. Я хотел, чтобы у каждого элемента были уникальные функции.
Грязный раствор
Конечно, я мог бы сделать что-то вроде этого:
hideElementWhenIdle = function($el) {
let fn = _.debounce(($el) => {
// ... same as above
}, 5000);
return fn;
}
hideSelector1WhenIdle = hideElementWhenIdle( $("selector-1") );
hideSelector2WhenIdle = hideElementWhenIdle( $("selector-2") );
Теперь у меня будет две независимые функции, которые я могу вызывать. Однако это явно грязно и не масштабируется (хотя, честно говоря, у меня есть только два элемента, которые мне нужно применить для работы в любом случае).
Неудачная попытка
Я думал, что смогу wrap
и memoize
выполнить свою функцию, чтобы добиться того, что я хотел сделать, но после нескольких попыток я не могу понять, что происходит (или правильное ли это решение). Вот моя последняя попытка:
var hideElementWhenIdle = _.wrap(
_.memoize(
function($el) {
var fn = _.debounce(() => {
// ... same as above
}
),
function(func, $el) {
return func($el);
}
);
Я предполагаю, что моя проблема здесь в том, что _.debounce
всегда возвращает одно и то же значение, поэтому я всегда кэширую одно и то же значение независимо от $el
.