7

我需要让一个函数运行固定的秒数,然后终止。我可以使用 jQuery 或网络工作者,但我尝试这样做直接失败了。

Tks 的帮助现在有效:

startT = new Date().getTime();
i = 1;

while(true){
    now = new Date().getTime();
    if( (now - startT) > 100) {
        break;
    } 

    i++;
}

alert(i);
4

4 回答 4

3

您提出的方法不起作用,因为Javascript(大部分)是单线程的-循环以无限循环开始,因此setTimeout处理程序永远不会被调用,因此keepGoing永远不会被设置,因此循环无法完成。

确定函数完成的绝对时间是最简单的,并且每隔一段时间(即不是在每次迭代中)检查当前时间是否已超过该点。

选择一些迭代,让您在经过时间的测试效率和您准备让函数拥有的“加班”量之间取得合理的折衷。

于 2013-03-05T15:45:13.843 回答
1

Count 开始无限循环,您的代码永远不会到达 setTimeout()。

于 2013-03-05T15:45:26.567 回答
1

三个问题:

  • 您的超时设置为在一毫秒内触发
  • setTimeout将无法到达,因为count永远不会完成
  • alert应该在,count之后while或从setTimeout回调内部调用。

解决这些问题,您的代码应该可以工作。不过,我可能已经预先设置了结束日期,并与while.

于 2013-03-05T15:46:20.980 回答
0

我不知道目的是什么,但你必须打断

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 的指令 :)

于 2013-03-05T16:17:55.933 回答