2013-03-05 201 views
6

我需要讓某個函數運行固定的秒數,然後終止。我可以使用jQuery或網絡工作者,但我嘗試直接使用它。在javascript中固定時間後停止函數的執行

韓國社交協會的幫助現在這個工作:

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

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

    i++; 
} 

alert(i); 

回答

3

你提出的方法是行不通的,因爲JavaScript是(主要)單線程 - 循環無限循環開始了,所以setTimeout處理程序從未被調用,所以keepGoing永遠不會被設置,所以循環無法完成。

確定函數完成的絕對時間是最簡單的,並且每隔一次(即不是每次迭代)檢查當前時間是否已經過了該點。

選擇一些迭代次數,可以讓您在經過時間的測試效率和準備讓函數擁有的「超時」數量之間找到合理的折衷。

1

計數開始無限循環,您的代碼永遠不會達到setTimeout()。

1

三個問題:

  • 你超時設置在一毫秒火
  • setTimeout不會達到的,因爲count寫不完
  • alertwhile後從count中調用,或從setTimeout回調中獲得。

解決這些問題,你的代碼應該可以工作。不過,我可能會先設定結束日期,然後與while中的日期進行比較。

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的調整,你將需要預先知道一點(超過下一個勾號),所以你可以設置最後的setTimeo在確切的時間(諮詢當前日期和保存的初始日期)。 一切都可以分成更小的塊,就像CPU的指令:)