当前位置:首页 > JavaScript

秒杀 js 实现

2026-02-01 22:43:45JavaScript

秒杀功能的实现要点

前端实现秒杀功能需要处理高并发、时间同步、防刷等问题。以下是基于JavaScript的核心实现逻辑:

倒计时功能

使用定时器实现秒杀倒计时,需确保与服务器时间同步:

秒杀 js 实现

function countDown(endTime) {
  const timer = setInterval(() => {
    const now = new Date().getTime();
    const distance = endTime - now;

    const days = Math.floor(distance / (1000 * 60 * 60 * 24));
    const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
    const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
    const seconds = Math.floor((distance % (1000 * 60)) / 1000);

    if (distance < 0) {
      clearInterval(timer);
      document.getElementById("countdown").innerHTML = "秒杀已开始";
    }
  }, 1000);
}

按钮状态控制

秒杀未开始时禁用按钮:

const seckillBtn = document.getElementById('seckill-btn');
if (new Date() < startTime) {
  seckillBtn.disabled = true;
  seckillBtn.innerText = '秒杀未开始';
}

请求并发控制

使用Promise和限流策略:

秒杀 js 实现

let requestQueue = [];
let isRequesting = false;

async function throttleRequest() {
  if (isRequesting) {
    return Promise.reject('请求过于频繁');
  }

  isRequesting = true;
  try {
    const res = await fetch('/seckill', {method: 'POST'});
    return res.json();
  } finally {
    isRequesting = false;
    if (requestQueue.length > 0) {
      throttleRequest();
    }
  }
}

防止重复提交

提交后立即禁用按钮:

seckillBtn.addEventListener('click', () => {
  seckillBtn.disabled = true;
  throttleRequest()
    .then(data => {
      alert(data.message);
    })
    .catch(err => {
      seckillBtn.disabled = false;
      console.error(err);
    });
});

时间同步方案

定期与服务器同步时间:

function syncServerTime() {
  fetch('/api/time')
    .then(res => res.json())
    .then(data => {
      const serverTime = new Date(data.time);
      const localTime = new Date();
      timeDiff = serverTime - localTime;
    });
}

// 每5分钟同步一次
setInterval(syncServerTime, 300000);

性能优化建议

  1. 使用WebWorker处理倒计时计算
  2. 采用本地缓存记录已售罄状态
  3. 实现请求队列避免瞬间高并发
  4. 添加动画效果提升用户体验

后端需要配合实现库存原子性操作、分布式锁等机制,前端主要关注用户体验和请求控制。实际项目中建议使用WebSocket实现状态实时推送。

标签: 秒杀js
分享给朋友:

相关文章

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previ…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现图片放大缩小

js实现图片放大缩小

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

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounc…