0

我有一些滑块,当改变时会运行相当繁重的计算功能。这会导致在拖动滑块时出现一些严重的卡顿,以及总体上糟糕的体验。

所以我的想法是使用去抖动,这样如果最后一次计算还没有完成,它将被丢弃,并开始一个具有最新输入值的新计算。

问题是我的 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);
    });
  };
}
4

0 回答 0