【发布时间】:2017-11-19 13:51:14
【问题描述】:
我不能使用很多 NPM 库来获得准确的计时器,因为它依赖于我没有使用的 Node.. 但公式非常简单。这是我正在使用的 JSfiddle:
setPercentageBar(page) {
if (this.state.pagesById[page.id].active) {
let pagesByIdCopy = Object.assign({}, this.state.pagesById);
let pageCopy = pagesByIdCopy[page.id];
let percent = (100.0 / parseFloat(page.durationTime)) / 10;
pageCopy.percentage += percent;
this.setState({pagesById: pagesByIdCopy});
pageCopy.progressBarNextAt += this.progressBarTime; // this.progressBarTime = 100
console.log('start time');
console.log(pageCopy.progressBarStart);
console.log('next at');
console.log(pageCopy.progressBarNextAt);
console.log('drift');
console.log((new Date().getTime() - pageCopy.progressBarStart) % 100);
console.log('Date().getTime():');
let currTime = new Date().getTime();
console.log(currTime);
console.log('interval time');
console.log(pageCopy.progressBarNextAt - currTime);
console.log('--------------------------------------------------------\n');
if (pageCopy.percentage < 100) {
pageCopy.progressBarTimer = setTimeout(() => this.setPercentageBar(pageCopy),
pageCopy.progressBarNextAt - currTime);
}
}
}
这不是我在 React 中所做的确切代码,但它是完全相同的公式。
除了使用 100 毫秒延迟外,我正在使用它来更新进度条,并且我需要进度条顺利展开。
我正在记录 startTime、nextAt 时间、漂移和间隔时间,而且开始时总是很好。但是在某些时候..间隔时间变成负数,我不知道为什么!然后从那一刻起,一切都开始变得混乱。我已经尝试了这个精确计时器的多个公式,最终每次都会发生。一旦间隔时间变为负数..它们都变为负数。
任何人都知道为什么以及我可以做些什么来解决它?
这里有一些示例日志
编辑:我最多有 5 个计时器,每个计时器运行 100 毫秒
【问题讨论】:
-
计时器从不精确...而且新日期也不是...johnresig.com/blog/accuracy-of-javascript-time
-
在你的小提琴中你写了“这个作品!”,那么问题是什么?
-
@trincot 查看我在 pastebin 上发布的日志.. 你可以看到间隔在某些时候变成了负数,我试图弄清楚它为什么会这样做,以便我可以解决这个问题。
-
如果您只提供问题的日志以及显然不会产生问题且不是您的代码的代码,您希望我们如何分析问题?你必须提供一些我们可以复制它的东西。
-
你们这些投反对票的人对这个社区来说太可怕了。人们只是想在这里寻求帮助。如果我们没有正确提出要求,但我们真的想提供所有我们能提供的信息,为什么要投反对票。
标签: javascript jquery reactjs timer ecmascript-6