как предотвратить одновременное срабатывание функции прослушивателя - PullRequest
0 голосов
/ 22 апреля 2020

мой вопрос прост, я использую discord js и в моем коде есть прослушиватель событий. эта функция слушателя срабатывает, когда пользователь отправляет конкретное сообщение в канале. Но если два пользователя отправляют это конкретное сообщение одновременно, функция прослушивания запускается дважды одновременно. Как я могу предотвратить это?

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Если вы счастливы игнорировать второе поступающее сообщение, вы можете посмотреть, как обернуть вашу функцию с помощью debouncing , что приведет к ее срабатыванию только один раз при вызове в короткой последовательности.

Loda sh имеет пакет для этого, который можно импортировать по отдельности

import { myFunc } from 'somewhere';
import { debounce } from 'somewhereElse';

const DEBOUNCE_DELAY_MS = 500;
const myDebouncedFunc = debounce(myFunc, DEBOUNCE_DELAY_MS);

// Call myDebouncedFunc twice immediately after each other, the 
// debouncing will result in the function only getting called max once 
// every 500ms;
myDebouncedFunc();
myDebouncedFunc();

В противном случае, если вам нужно обработать оба сообщения, только не одновременно, тогда вам нужно что-то вроде очереди для обработки этих событий. Затем вы можете обработать эти сообщения, например, с интервалом.

// Some lexically available scope
const myQueue = [];

// Event handler
const myHandler = (msg) => {
  myQueue.push(msg);
}

// Interval processing
setInterval(() => {
  if (myQueue.length > 0) {
    const msgToProcess = myQueue.shift();
    processMessage(msgToProcess);
  }
}, 500)

1 голос
/ 22 апреля 2020

Существует несколько способов решения этой проблемы в зависимости от ваших потребностей.

  1. Отмените регистрацию прослушивателя событий, как только наступит событие. В большинстве библиотек этого легко добиться, зарегистрировав событие, используя метод Once () вместо «on ()»
  2. Используйте debounce () для агрегирования всех события, инициируемые в течение определенного промежутка времени, превращаются в единое целое.

В большинстве JS библиотек, похожих на loda sh.

, существуют такие же или похожие методы.
...