用setTimeout代替setInterval

前言

今天分享的小技巧是我在工作开发过程中遇到的一个问题,觉得处理这个问题比较不错,给大家分享一下

一、场景

当时的场景大致是这个样子的,拿到一个带开始时间和结束时间的一个对象数组,当当前时间在对象某一个时间段的时候,需要查询这个时间段的数据,当然查询数据在这不做考虑

javascript 复制代码
const arr = [
  { startTime: '2026-01-08 20:15', endTime: '2026-01-08 20:31', id: 1 },
  {
    startTime: '2026-01-08 20:32',
    endTime: '2026-01-08 20:45',
    id: 2,
  },
]

当当前时间在20:15-20:31的时候,需要干其他事,当在20:32-20:45需要做一些事

这就是这个问题的场景

二、方案

我相信大家有一个方案肯定轮询,去不断反复判断当前时间在哪个阶段;

但是这种会有以下几个问题

  1. 如果轮询设置时间过长,会导致无法及时获取数据;比如我设置10分钟一次,但是恰好我一分钟的时候就进入20:32,那么我需要额外等待9分钟才能查到数据
  2. 如果设置过短,计算太过频繁,会影响性能(当然性能影响很小)

这就引出我们今天这个解决方案,用setTimeout来处理

解决方案

大致思路事,初始化调用的时候计算当前时间与下一条的开始时间的差值,然后在setTimeout里面继续执行这个方法,延迟时长设置为你计算的差值,代码如下

javascript 复制代码
import dayjs from 'dayjs'
const arr = [
  { startTime: '2026-01-08 20:15', endTime: '2026-01-08 20:46', id: 1 },
  {
    startTime: '2026-01-08 20:47',
    endTime: '2026-01-08 20:45',
    id: 2,
  },
]
// 获取当前时间戳
export const getCurrentTime = () => {
  return dayjs().unix()
}
// 比较当前时间
export const culcTime = (time: string) => {
  const currentTime = getCurrentTime()
  //   获取20:15的时间戳
  const timeStamp = dayjs(time).unix()
  return timeStamp - currentTime
}
// 干其他事
const doOtherThing = () => {
  console.log('干一些其他事')
}
export const checkTime = () => {
  const time = culcTime(arr[1].startTime)
  doOtherThing()
  
  if (time <= 0) {
    return
  }
  setTimeout(() => {
    checkTime()
  }, time * 1000)
}

我们看一下案例,数据的开始结束时间,自己定义以下

第一次

第二次

这样就能很好的避免上面所说的一些问题

虽然setTimeout也并不非常准确(dddd(懂得都懂)),但是这些误差是在能接受的范围的

也并不需要考虑

总结

以上就是一种在这种场景的比较好的优化手段,ai给的提示(ai真猛)

如果有更好的方案,欢迎提出

相关推荐
晴天的雨.9922 小时前
【C++算法】和为s的两个数
开发语言·数据结构·c++·算法
开开心心就好5 小时前
批量提取PDF中的图片,直接导出原图
前端·javascript·支持向量机·智能手机·pdf·html·启发式算法
IvanCodes7 小时前
Python 数据处理(十三):JSON、CSV 与数据序列化
开发语言·python
Setsuna_F_Seiei7 小时前
前端转型 Agent 开发 05 之 Agent Hooks 与 Checkpointer(让 Agent 从全自动转变人为可掌控)
前端·agent·ai编程
aramae8 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
百万蹄蹄向前冲9 小时前
风扇转了一晚上MVP专家团翻车事故
前端·人工智能
默_笙9 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
linux_cfan11 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
qq_25183645711 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
kyriewen11 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程