我需要让一个函数运行固定的秒数,然后终止。我可以使用 jQuery 或网络工作者,但我尝试这样做直接失败了。
Tks 的帮助现在有效:
startT = new Date().getTime();
i = 1;
while(true){
now = new Date().getTime();
if( (now - startT) > 100) {
break;
}
i++;
}
alert(i);
我需要让一个函数运行固定的秒数,然后终止。我可以使用 jQuery 或网络工作者,但我尝试这样做直接失败了。
Tks 的帮助现在有效:
startT = new Date().getTime();
i = 1;
while(true){
now = new Date().getTime();
if( (now - startT) > 100) {
break;
}
i++;
}
alert(i);
您提出的方法不起作用,因为Javascript(大部分)是单线程的-循环以无限循环开始,因此setTimeout
处理程序永远不会被调用,因此keepGoing
永远不会被设置,因此循环无法完成。
确定函数完成的绝对时间是最简单的,并且每隔一段时间(即不是在每次迭代中)检查当前时间是否已超过该点。
选择一些迭代,让您在经过时间的测试效率和您准备让函数拥有的“加班”量之间取得合理的折衷。
Count 开始无限循环,您的代码永远不会到达 setTimeout()。
三个问题:
setTimeout
将无法到达,因为count
永远不会完成alert
应该在,count
之后while
或从setTimeout
回调内部调用。解决这些问题,您的代码应该可以工作。不过,我可能已经预先设置了结束日期,并与while
.
我不知道目的是什么,但你必须打断
function count() {
while(keepGoing) {
i = i+1;
}
}
一段时间,以便有机会keepGoing
在同时运行的其他地方进行更改。你也永远不会这样做:
while(keepGoing) {
i = i+1;
}
您完全阻塞了所有线程......您将不得不将函数的工作分成小块并使用 setTimeout 或 setInterval 小批量运行它,如下所示,同时接近您可能想要的:
var piece_n=0;
var keepGoing = true;
var interval_id = setInterval(function () {
if(keepGoing){
//do_a_short_piece_of_work(piece_n);
piece_n++;
}else{
clearInterval(interval_id);
}
},500); //ticking every half second
setTimeout(function () { keepGoing = false; }, 10000); //run for a small bit more than 10 to 10.5 seconds + do_a_short_piece_of_work() execution time
如果您只需要 10 秒而不会饿死剩下的,您将需要在一系列 setTimeout 中进行调整,并且您需要提前知道一点(超过下一个滴答声),以便您可以在确切时间设置最后一个 setTimeout(咨询当前日期和保存的初始日期)。一切都可以分成更小的块,比如 CPU 的指令 :)