当前位置:首页 > JavaScript

js实现防洪

2026-02-28 19:26:52JavaScript

实现防洪功能的JavaScript方法

防洪(Flood Control)通常指在Web应用中防止用户短时间内频繁提交请求或操作,例如重复点击按钮、恶意刷接口等。以下是几种常见的实现方式:

防抖(Debounce)

防抖确保在事件触发后延迟执行回调,若在延迟期间再次触发则重新计时。适用于输入框搜索联想等场景。

js实现防洪

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

// 使用示例
const searchInput = document.getElementById('search');
searchInput.addEventListener('input', debounce(function() {
  console.log('发送搜索请求');
}, 500));

节流(Throttle)

节流规定在单位时间内最多执行一次回调。适用于滚动事件、按钮频繁点击等场景。

js实现防洪

function throttle(func, interval) {
  let lastTime = 0;
  return function(...args) {
    const now = Date.now();
    if (now - lastTime >= interval) {
      func.apply(this, args);
      lastTime = now;
    }
  };
}

// 使用示例
const button = document.getElementById('submit');
button.addEventListener('click', throttle(function() {
  console.log('提交表单');
}, 1000));

请求锁(Request Lock)

通过标志位或Promise状态锁定请求,避免并发重复提交。

let isSubmitting = false;

async function handleSubmit() {
  if (isSubmitting) return;
  isSubmitting = true;

  try {
    await fetch('/api/submit', { method: 'POST' });
  } finally {
    isSubmitting = false;
  }
}

令牌桶算法(Token Bucket)

高级限流算法,控制请求速率。适用于API调用限制。

class TokenBucket {
  constructor(capacity, fillRate) {
    this.capacity = capacity;
    this.tokens = capacity;
    this.fillRate = fillRate; // 令牌/毫秒
    this.lastTime = Date.now();
  }

  consume(tokens = 1) {
    this.refill();
    if (this.tokens >= tokens) {
      this.tokens -= tokens;
      return true;
    }
    return false;
  }

  refill() {
    const now = Date.now();
    const delta = (now - this.lastTime) * this.fillRate;
    this.tokens = Math.min(this.capacity, this.tokens + delta);
    this.lastTime = now;
  }
}

// 使用示例
const bucket = new TokenBucket(10, 0.001); // 10令牌,每秒补充1个
setInterval(() => {
  if (bucket.consume()) {
    console.log('允许请求');
  } else {
    console.log('请求被限流');
  }
}, 100);

实际应用建议

  • 前端防抖/节流:减少无效请求,提升用户体验。
  • 后端验证:前端防护可绕过,需结合后端限流(如Redis计数器)。
  • HTTP状态码:返回429(Too Many Requests)明确限流状态。

通过组合上述方法,可有效实现不同场景下的防洪需求。

标签: js
分享给朋友:

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…

js 实现滚动

js 实现滚动

实现滚动的方法 使用 window.scrollTo() window.scrollTo() 方法可以滚动到文档中的特定位置。可以指定 x 和 y 坐标,或者使用平滑滚动的选项。 // 滚动到指定位…