Есть ли способ поймать несколько событий одного типа одновременно? - PullRequest
0 голосов
/ 08 июля 2019

Я разрабатываю плагин для этой большой (и не очень хорошо документированной) платформы.Мне нужно привязать функцию Javascript к событию.Проблема в том, что это событие вызывается несколько раз в одно и то же время (я не могу это контролировать), и мне нужно, чтобы эта функция запускалась только один раз, тем более что в нее включены некоторые вызовы Ajax.

Я не очень хорошо знаком с Javascript, поэтому этот вопрос может показаться довольно глупым, но есть ли способ как-то «буферизовать» события на короткий промежуток времени, а когда больше нет входящих, запустить функцию?

1 Ответ

1 голос
/ 08 июля 2019

Обычно это называется debouncing. Вот хорошая статья , касающаяся регулирования и устранения помех.

Метод Debounce позволяет нам «группировать» несколько последовательных вызовов в один.

В статье перечислено несколько реализаций, но пример реализации может быть (эта версия будет вызывать событие в конце ваших многочисленных вызовов, как только они перестанут срабатывать в течение указанного периода времени ):

function debounce(callback, duration) {
    let timer = null;
    let args = [];
    let thisVal = null;
    function trigger() { callback.apply(thisVal, args); }
    function onEvent() {
        thisVal = this;
        args = [].slice.call(arguments);
        clearTimeout(timer);
        timer = setTimeout(trigger, duration);
    }
    return onEvent;
}

Тогда вы можете позвонить, используя следующий код, например:

function myEventListener(data) {
    // do your thing
}
window.addEventListener('my-event', debounce(myEventListener, 100));

, что предотвратит повторный вызов вашего прослушивателя событий, пока он не перестанет срабатывать хотя бы на 100 мс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...