【发布时间】:2017-04-06 09:48:33
【问题描述】:
我的假设是时间总是向前流逝,但显然有时它不会以这种方式发生。
我有以下例子:
var LOOP_MS = 100;
var prevCall = +new Date();
setTimeout(function loop() {
foobar();
setTimeout(loop, LOOP_MS);
}, LOOP_MS);
function foobar() {
var now = +new Date(),
diff = now - prevCall; // expected to be somewhere around LOOP_MS
// do stuff
console.log(diff);
prevCall = now;
}
现在,大部分时间它都按预期工作,diff 显示的数字接近 100。当然,在现实生活中,我希望这个数字会上升,尤其是当用户的计算机处于执行一些繁重的操作。
我没想到的是看到一个负数,但它确实发生了。怎么可能?我错过了什么吗?我想这可能是由不同的时区引起的,但事实并非如此。我也在不同的浏览器(Chrome、Firefox、Safari)中看到它,并且差异值非常不一致:从 -9 到 -100 000。
它发生在大约 0.025% 的生产案例中,所以这不是一个大问题,但我想知道它到底怎么可能发生(即使在理论上)?
我想我设法通过在慢速 VM 中运行脚本并模拟高 CPU 负载在本地重现了几次,但我仍然不明白为什么该函数会显示负数(意思是 now早于prevCall)。
【问题讨论】:
-
你能告诉我们哪个输入
prevCall和now显示出这样的行为吗? -
@GerardoFurtado 这是
(new Date()).getTime()的快捷方式 -
@gurvinder372 我不确定我是否理解你的问题。整个代码在帖子里,没有输入。
-
我发现这很有趣并设置了一个 plunker plnkr.co/edit/cqqBBmIEMg518ZEEXuys?p=preview。我无法用负数重现您的问题。运行时,数字始终至少为 100。
-
正如@Hinrich 所说,无法重现此内容。也许你的硬件有问题。
标签: javascript time