当前位置:首页 > JavaScript

秒杀 js 实现

2026-02-01 22:43:45JavaScript

秒杀功能的实现要点

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

倒计时功能

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

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和限流策略:

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);
    });
});

时间同步方案

定期与服务器同步时间:

秒杀 js 实现

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中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现图表

js实现图表

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

js实现二叉树

js实现二叉树

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

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js 实现滚动

js 实现滚动

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

js实现图片放大

js实现图片放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性实现图片放大效果。当鼠标悬停时,图片会平滑放大。 const img = document…