Функция Debounce не снижает заикание при тяжелых вычислениях

У меня есть несколько ползунков, которые при изменении запускают довольно тяжелую функцию вычислений. Это приводит к некоторому сильному заиканию при перетаскивании слайдера и в целом к ​​плохому опыту.

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

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

function debounce(callback) {
  let handle;

  return function debounced(...args) {
    return new Promise(resolve => {
      if (handle !== undefined) {
        cancelAnimationFrame(handle);
      }

      const delayed = () => {
        resolve(callback.apply(this, args));
        handle = undefined;
      };

      handle = requestAnimationFrame(delayed);
    });
  };
}

0 ответов

Другие вопросы по тегам