最近在写一个定时触发任务的功能,setInterval就不考了,因为它的时间触发完全是随心所欲的,不是很准确,我要的定时是每分钟准时触发,那就只能使用setTimeout自己来手动计算下一个定时触发的时间。
这里要考虑的地方就是,在计算下一个时间点间隔的时候,需要把计算过程的时间也要考虑在内,因为setTimeout的精度是毫秒,不可能计算时间差的时间是0毫秒,因此为了最大准确度计算出一分钟的时间间隔,必须要考虑计算所消耗的时间。
const nextInterval = () => {
const a = new Date();
const m = new Date(a.getTime() + 60000);
m.setMilliseconds(0);
m.setSeconds(0);
const d = Date.now() - a.getTime();
const result = m.getTime() - a.getTime() - d;
return result;
}
以上代码就是能够做到精确到1ms的定时函数,你可以根据需要将60000改成需要的时间间隔,我这里是1分钟。下面是我实验的结果,可以看到几乎就是差了1到2毫秒的误差,如果非要实现0误差,只要返回result的时候再减去1就可以了。
但是这个方法也不是每次都很准确,前提是你的系统不繁忙,如果系统很繁忙的话也会出现35ms的误差。