xxleyi / learning_list

聚集自己的学习笔记
10 stars 3 forks source link

throttle 节流代码实现 #220

Open xxleyi opened 4 years ago

xxleyi commented 4 years ago

节流:在密集的事件流中,以固定时间间隔执行回调函数。

  const throttle = (callback, interval) => {
    let throttleTimeout
    let shouldHandleEvent = true
    let currentEvent = null

    const throttledEventHandler = event => {
      // 更新当前事件到闭包变量
      currentEvent = event

      // 按需执行回调动作
      if (shouldHandleEvent) {
        // 执行回调
        callback(currentEvent)

        // 清除当前事件
        currentEvent = null

        // 设置节流器
        throttleTimeout = setTimeout(() => {
          // 清除节流器
          clearTimeout(throttleTimeout)
          // 允许回调
          shouldHandleEvent = true
          if (currentEvent) {
            throttledEventHandler(currentEvent)
          }
        }, interval)
        // 禁止回调
        shouldHandleEvent = false
      }
    }

    return throttledEventHandler
  }