You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现仅统计过去一分钟内的函数调用次数?现有代码存在问题

解决一分钟内调用次数统计的问题

嘿,我来帮你搞定这个统计函数的问题!先拆解下你当前代码里的几个关键问题,再给你一个靠谱的解决方案。

你当前代码的问题分析

  1. 循环逻辑漏洞:你用for循环遍历数组时,每次执行shift()会让数组元素整体前移,但i还在递增,这会导致很多过期元素被跳过检查。比如移除第一个元素后,原来的第二个元素变成了第一个,但i直接跳到1,就错过了对这个新首元素的判断,导致过期记录残留。另外,循环条件i <= jCountArray.length会触发数组越界,因为数组索引是从0到length-1的。
  2. 时间阈值错误:你代码里判断的是超过10秒的记录就移除,但需求是统计过去一分钟(60秒)的调用,这里数值写错啦。
  3. 全局变量风险:如果jCountArray是全局变量,很容易被其他代码意外修改,导致统计结果出错。

修正后的解决方案

我用闭包封装了调用时间数组,既避免了全局污染,又能正确清理过期记录,效率也更高:

const Count = (() => {
  // 用闭包维护调用时间戳数组,仅Count函数可访问
  const callTimestamps = [];
  const ONE_MINUTE_MS = 60 * 1000; // 一分钟对应的毫秒数

  return () => {
    const now = Date.now(); // 获取当前时间戳,比new Date().getTime()更高效
    callTimestamps.push(now);

    // 清理过期记录:因为数组按调用顺序插入,最早的记录在最前面,只需检查首元素
    while (callTimestamps.length > 0 && now - callTimestamps[0] >= ONE_MINUTE_MS) {
      callTimestamps.shift();
    }

    console.log(callTimestamps);
    return callTimestamps.length;
  };
})();

方案优势说明

  • 闭包封装:把callTimestamps放在闭包里,只有Count函数能操作它,避免全局变量被意外修改的风险。
  • 高效清理:因为每次调用都是按时间顺序添加记录,最早的记录在数组最前面,所以用while循环检查首元素是否过期即可,不用遍历整个数组,性能更好。
  • 可读性强:把一分钟的毫秒数定义为常量ONE_MINUTE_MS,代码更清晰,后续要调整时间阈值也很方便。
  • 性能优化:用Date.now()获取时间戳,比new Date().getTime()更简洁高效。

现在你调用这个Count函数,就能准确返回过去一分钟内的调用次数啦!

内容的提问来源于stack exchange,提问作者RTVBasic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:20:53