我正在处理以下谜题,我无法理解为什么会这样。
我有以下[我相信]相当于javascript代码的部分,但是一个不能按预期工作(请注意Console.Log):
一次更新用户界面,然后无意中停止更新:http://jsfiddle.net/silentwarrior/1m0v6oj1/
jQuery(function () {
var isWorking = true;
if (isWorking) {
var timeEnd = 1431220406000; // generated from php
var timeNow = 1431210557000; // generated from php
var counter = 1;
var t = "";
setInterval(function () {
try {
var c = timeEnd - timeNow - counter;
console.log(c);
var d = new Date(c);
if (c <= 1) {
window.location.href = window.location.href;
return;
}
t = "";
if (d.getHours() > 0) {
t += d.getHours() + "h ";
}
if (d.getMinutes() > 0) {
t += d.getMinutes() + "m ";
}
t += d.getSeconds();
jQuery("#factory_start_prod").val("Working ... " + t + "s left");
counter = counter + 1;
} catch (e) {
}
}, 1000);
}
});
按预期不断更新用户界面:http://jsfiddle.net/silentwarrior/n3gkum2e/
jQuery(function () {
var isWorking = true;
if (isWorking) {
var timeEnd = 1431220406000;
var timeNow = 1431210557000;
var counter = 1;
var t = "";
setInterval(function () {
try {
var c = timeEnd - Date.now();
console.log(c);
var d = new Date(c);
if (c <= 1) {
window.location.href = window.location.href;
return;
}
t = "";
if (d.getHours() > 0) {
t += d.getHours() + "h ";
}
if (d.getMinutes() > 0) {
t += d.getMinutes() + "m ";
}
t += d.getSeconds();
jQuery("#factory_start_prod").val("Working ... " + t + "s left");
counter = counter + 1;
} catch (e) {
}
}, 1000);
}
});
彼此唯一的区别是,工作的那个使用Date.now()来获取当前时间戳,而另一个使用预先建立的时间戳。
为什么一个示例会正确更新输入中的文本而另一个不会?
PS:对我来说,使用生成的时间戳代替Date.now()非常重要,以便在计算剩余时间时不依赖于用户系统。
答案 0 :(得分:1)
您的第一个示例正在运行,但是每次迭代时,您只需从时间戳值中减去1
,这相当于1ms
。因此,除非您等待真正长时间,否则价值永远不会改变。您需要在每次迭代时将counter
增加1000
一秒钟才能计算:
counter = counter + 1000;