javascript 精确定时器

2020-05-11  本文已影响0人  秋无衣

使用原生语法的缺陷

时间越长, 误差可能越大. 计时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)
    })

image.png

打印结果截图, 每个整秒差值在17ms内. 用差不多17ms去测量1000ms, 结果当然是比较准确的

缺陷

占用资源当然会高一些

上一篇 下一篇

猜你喜欢

热点阅读