【发布时间】:2015-09-25 19:59:26
【问题描述】:
我一直在使用在我的应用程序中使用 setInterval(fn,delay) 函数的脚本,在阅读了 setTimeout 和 JS 的工作原理之后,我遇到了一些奇怪的结果,所以我做了一个测试: 这是jsfiddle https://jsfiddle.net/jyq46uu1/2/
建议的代码:
var limit = 1000000000;
var intervals = 0;
var totalTime = new Date();
var startTime = new Date();
var uid = setInterval(
function () {
// final lap?
if (intervals == 9) clearInterval(uid);
for (i = 0; i < limit; i += 1) {
// just working the CPU
}
// reduce the iterations
limit = limit / 10;
intervals += 1;
console.log('Interval ' + intervals +' Time elapsed : ' + (new Date() - startTime));
// reset the time
startTime = new Date();
}, 250, 9);
好的,根据我从http://ejohn.org/blog/how-javascript-timers-work/ Javascript 得到的消息,即使“线程被阻塞”,也会在 setInterval 中为函数调用计时器,所以如果函数仍在执行,则调用只是排队等等依此类推......在我的笔记本中,代码会产生这样的结果:
"Interval 1 Time elapsed : 4264"
"Interval 2 Time elapsed : 477"
"Interval 3 Time elapsed : 91"
"Interval 4 Time elapsed : 170"
"Interval 5 Time elapsed : 246"
"Interval 6 Time elapsed : 242"
"Interval 7 Time elapsed : 248"
"Interval 8 Time elapsed : 248"
"Interval 9 Time elapsed : 248"
好的,如果我的红色是真的,到第一个间隔结束时,所有函数调用都在队列中......在我的脚本中,我正在减少每次执行的工作量,因此每次调用应该花费更少秒比前一个,但无论我设置多少迭代,经过的时间总是在第 4 次运行后加快间隔速度。 也许我弄错了,但如果到 4264 时所有函数都已经在队列中并且假设立即运行,它们应该显示更少的时间,对吗? ...如果第 3 次迭代显示 91 并且其他的就在后面,他们应该取 91 或更少。但事实并非如此。
如果你明白发生了什么,请向我解释一下,因为我认为我遗漏了一些东西。
【问题讨论】:
标签: javascript timer settimeout