当前位置:首页 > JavaScript

js实现防洪

2026-01-14 14:07:49JavaScript

防抖(Debounce)实现

防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。

function debounce(func, delay) {
  let timeoutId;
  return function(...args) {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

// 使用示例
const input = document.getElementById('search-input');
input.addEventListener('keyup', debounce(function() {
  console.log('Searching for:', input.value);
}, 500));

节流(Throttle)实现

节流的核心思想是在固定时间间隔内只执行一次回调函数。适用于滚动事件、鼠标移动等高频触发场景。

function throttle(func, limit) {
  let inThrottle;
  return function(...args) {
    if (!inThrottle) {
      func.apply(this, args);
      inThrottle = true;
      setTimeout(() => inThrottle = false, limit);
    }
  };
}

// 使用示例
window.addEventListener('scroll', throttle(function() {
  console.log('Scrolling...');
}, 1000));

请求限流(Rate Limiting)

对于API请求,可通过令牌桶算法实现限流,控制单位时间内的请求数量。

class RateLimiter {
  constructor(limit, interval) {
    this.limit = limit;
    this.interval = interval;
    this.queue = [];
    this.tokens = limit;
    setInterval(() => this.refillTokens(), interval);
  }

  refillTokens() {
    this.tokens = Math.min(this.limit, this.tokens + 1);
    this.processQueue();
  }

  processQueue() {
    while (this.tokens > 0 && this.queue.length > 0) {
      const request = this.queue.shift();
      this.tokens--;
      request.resolve(request.fn());
    }
  }

  enqueue(fn) {
    return new Promise((resolve) => {
      this.queue.push({ fn, resolve });
      this.processQueue();
    });
  }
}

// 使用示例
const limiter = new RateLimiter(5, 1000); // 每秒5次请求
async function makeRequest() {
  return limiter.enqueue(() => fetch('https://api.example.com'));
}

批量处理(Batching)

对于高频触发的事件(如实时日志),可通过批量处理减少操作次数。

js实现防洪

function createBatcher(processBatch, batchSize = 10, timeout = 1000) {
  let batch = [];
  let timer = null;

  function flush() {
    processBatch([...batch]);
    batch = [];
    clearTimeout(timer);
    timer = null;
  }

  return function(item) {
    batch.push(item);
    if (batch.length >= batchSize) {
      flush();
    } else if (!timer) {
      timer = setTimeout(flush, timeout);
    }
  };
}

// 使用示例
const logBatcher = createBatcher((logs) => {
  console.log('Batch logs:', logs);
});
document.addEventListener('click', (e) => logBatcher(e.target));

注意事项

  • 防抖和节流的区别:防抖在连续触发时只执行最后一次,节流在固定间隔执行。
  • 请求限流需考虑分布式环境下的同步问题,单机方案可使用Redis等中间件扩展。
  • 批量处理的超时时间和批次大小需根据实际场景调整。

标签: js
分享给朋友:

相关文章

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…

js 实现页面刷新

js 实现页面刷新

使用 location.reload() location.reload() 是原生 JavaScript 提供的页面刷新方法。调用该方法会重新加载当前页面,相当于点击浏览器的刷新按钮。 // 基本…