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

如何实现每分钟第10秒更新页面元素的最优实现方案

每分钟第10秒更新页面元素的优化实现方案

原有实现的核心问题

你当前使用的每秒轮询方案功能可正常运行,但存在几个明显的缺陷:

  • 无效执行开销:每秒触发1次回调,99%的场景下判断条件不满足,属于无意义的空执行,长期运行存在冗余开销
  • 漏触发风险:setInterval受主线程任务阻塞影响,回调执行时间会产生漂移,极端情况可能跳过第10秒的判断窗口,导致本次更新遗漏
  • 请求堆叠隐患:如果jama.php响应速度慢于1分钟,多次load请求会叠加,造成不必要的网络消耗和DOM更新冲突

优化后实现代码

核心思路是用setTimeout替代固定间隔的setInterval,每次执行前计算下一次触发的精确等待时间,执行完成后再调度下一次任务:

function updateJamaElement() {
  // 执行页面元素更新
  $('#jama').load('jama.php', function () {
    // 更新完成后调度下一次任务
    scheduleNextUpdate();
  }).fail(function () {
    // 请求失败也调度下一次,避免单次错误导致更新终止
    scheduleNextUpdate();
  });
}

function scheduleNextUpdate() {
  const now = new Date();
  const currentSec = now.getSeconds();
  let delayMs;
  // 计算距离下一个第10秒的毫秒间隔
  if (currentSec < 10) {
    delayMs = (10 - currentSec) * 1000 - now.getMilliseconds();
  } else {
    delayMs = (70 - currentSec) * 1000 - now.getMilliseconds();
  }
  setTimeout(updateJamaElement, delayMs);
}

// 页面加载完成后启动调度
scheduleNextUpdate();

优化优势说明

  • 无冗余开销:每次直接调度到下一次需要执行的时间点,中间没有任何无效的判断逻辑,性能开销降到最低
  • 触发时机准确:每次执行完都会基于当前时间重新计算间隔,完全避免计时漂移问题,不会漏过任何一次更新
  • 不会出现请求堆叠:只有上一次更新请求处理完成之后才会调度下一次,不会出现多请求并发的问题
  • 可维护性更高:后续如果要修改触发时间,只需要调整计算delayMs的数值即可,不需要修改整体逻辑

补充:如果对触发时间的精度要求不高,也可以保留原轮询方案,把轮询间隔调整为500ms,降低漏触发概率,但性能开销会比上述优化方案高。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:06:06