当前位置:首页 > JavaScript

js实现防洪

2026-04-03 19:51:48JavaScript

使用防抖(Debounce)技术

防抖是一种延迟执行函数的技术,直到事件停止触发一段时间后才执行。适用于输入框实时搜索、窗口大小调整等场景。

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

// 使用示例
const searchInput = document.getElementById('search');
const debouncedSearch = debounce(function() {
  console.log('执行搜索:', searchInput.value);
}, 500);

searchInput.addEventListener('input', debouncedSearch);

使用节流(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('滚动事件处理');
}, 1000));

限制请求频率

对于API请求,可以结合防抖/节流与计数器来限制请求频率。

let requestCount = 0;
const MAX_REQUESTS = 5;
const TIME_WINDOW = 10000; // 10秒

function makeRequest() {
  if (requestCount < MAX_REQUESTS) {
    requestCount++;
    setTimeout(() => requestCount--, TIME_WINDOW);
    console.log('请求发送');
  } else {
    console.log('请求过多,请稍后再试');
  }
}

验证码机制

在关键操作前加入验证码验证,可以有效防止自动化脚本的滥用。

function showCaptcha() {
  // 显示验证码UI
  console.log('请完成验证码验证');
  return new Promise(resolve => {
    // 假设用户完成验证后调用resolve
    setTimeout(() => resolve(true), 1000);
  });
}

async function sensitiveOperation() {
  const verified = await showCaptcha();
  if (verified) {
    console.log('执行敏感操作');
  }
}

令牌桶算法

更高级的流量控制算法,允许突发流量但限制平均速率。

js实现防洪

class TokenBucket {
  constructor(capacity, fillPerSecond) {
    this.capacity = capacity;
    this.tokens = capacity;
    setInterval(() => this.addToken(), 1000 / fillPerSecond);
  }

  addToken() {
    if (this.tokens < this.capacity) {
      this.tokens++;
    }
  }

  take() {
    if (this.tokens > 0) {
      this.tokens--;
      return true;
    }
    return false;
  }
}

// 使用示例
const bucket = new TokenBucket(10, 5);
function handleRequest() {
  if (bucket.take()) {
    console.log('请求处理');
  } else {
    console.log('限流中');
  }
}

这些方法可以根据实际场景组合使用,构建多层次的防洪系统。防抖和节流适合处理用户界面交互,令牌桶算法更适合API级别的流量控制,验证码则适用于关键操作的安全验证。

标签: js
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现点击显示和隐藏

js实现点击显示和隐藏

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

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…

js实现图片滚动

js实现图片滚动

图片滚动的实现方法 使用CSS动画实现 通过CSS的animation和@keyframes可以实现简单的图片滚动效果。这种方法适合静态图片的无缝循环滚动。 <style> .scr…