Dav*_*lsh 5 javascript crash google-chrome setinterval
我正在开发一个 Javascript 秒表应用程序,它适用于除 Chrome 之外的所有浏览器。
这是一个小提琴: http: //jsfiddle.net/djwelsh/Sxyy8/
理论上很简单。单击“开始”按钮会记录纪元时间(以毫秒为单位),并启动setInterval
. 在每个时间间隔上,从当前纪元时间中减去起始纪元时间。这给我们留下了一个以毫秒为单位的值,该值将被转换h:m:s:cs
并显示在页面上。
问题
我的问题是 Chrome 的问题。每次计时器达到 10000 毫秒时,选项卡就会崩溃并显示“噢,啪”消息。
一个奇怪的方面是,如果您点击“停止”,等待几秒钟,然后再次点击“开始” ,崩溃仍然会发生。这似乎表明这是一个内存问题——有些东西已经填满了,无法再容纳了,并且溢出了。但是在开发工具和资源监视器中检查内存并没有发现任何异常。
可能的解决方案
可以通过将间隔值更改为大于 100 毫秒的数字(我要使用的默认值是 50)来避免该问题。由于某种原因,也可以通过在控制台中记录计时器值来避免这种情况。
问题是,除非我知道为什么会发生这种情况,否则我不能确信这些快速修复方法实际上可以解决问题。在我知道该页面可以在所有当前浏览器中运行之前,我不想发布该页面。
我知道这似乎是一个范围相当狭窄的问题,但我希望解决方案能够揭示一些更大范围的内容,可能会帮助其他人(Chrome 的计时器功能或其他功能的特质)。
编辑 顺便说一句,我知道停止和重新启动计时器并不像真正的秒表中应有的那样工作;我还没有完成那部分的实现。我认为对于 SO 来说,让它尽可能简单会更好。
作为参考(和伟大的正义),这里是更新版本。在 10000 时仍然崩溃: http://jsfiddle.net/djwelsh/Sxyy8/7/
解决方案 根据@Akhlesh的回答,我更新了小提琴。它现在可以正常运行并且就像秒表一样:http ://jsfiddle.net/djwelsh/Sxyy8/18/
如果您想知道,我需要使用基于纪元的技术(而不是仅增加基值),因为有时内存使用问题会导致每秒不调用间隔 - 如果选项卡移至后台,而例如,计时器仍在运行。
您可以通过将 time 和 now 变量设置为全局变量来避免选项卡崩溃,而不是在 Update 函数中再次创建这些变量。
var uTime,uNow;
//Update function will use same variable to initialize time and now
updateTime: function () {
uNow = Date.now();
oO.milliseconds = uNow - oO.epoch;
uTime = oO.getTimeObject(oO.milliseconds);
oO.el.testClock.text('' + uTime.h + ':' + uTime.m + ':' + uTime.s + ':' + uTime.ms + '');
}
Run Code Online (Sandbox Code Playgroud)
我不确定原因,但我认为 GC 无法释放这些变量,同时分配新变量,这会导致崩溃。