使用原生语法的缺陷
时间越长, 误差可能越大. 计时100次1秒可能用110秒
解决方法
使用小粒度的时间分片, 满足需求的长度后记为1次切换
// 这里降低代码复杂度直接用rxjs
const t$ = timer(0, 17)
.pipe(
map(() => new Date().getTime()),
scan(
(arr, next) => {
const diff = next - arr[0]
const step = (diff / 1000) | 0 // 每1000ms计步
return [arr[0], next, diff, step]
},
[new Date().getTime(), new Date().getTime(), 0, 0],
),
distinctUntilChanged((a, b) => {
return b[3] === a[3]
}),
)
.subscribe((r) => {
// 初始化时间, 分片时间, 相差值, 步数
console.log(r)
})
打印结果截图, 每个整秒差值在17ms内. 用差不多17ms去测量1000ms, 结果当然是比较准确的
缺陷
占用资源当然会高一些