在javascript中的固定时间后停止执行功能

时间:2013-03-05 15:42:58

标签: javascript jquery web-worker

我需要让函数运行固定的秒数,然后终止。我可以使用jQuery或web worker,但我尝试直接使用它。

寻求帮助现在可行:

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

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

    i++;
}

alert(i);

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

三个问题:

  • 您的超时设置为以毫秒为单位
  • 您的setTimeout将无法联系,因为count永远不会完成
  • 您的alert应在countwhile内或setTimeout回调中调用。

解决这些问题,您的代码应该有效。不过,我可能已经预先设定了结束日期,并与while中的该日期进行比较。

答案 3 :(得分: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的说明:)