2013-03-05 17 views
6

関数を一定秒間実行させてから終了する必要があります。私はjQueryやWebワーカーを使用することができましたが、それを直接実行する試みは失敗しました。javascriptで一定時間後に関数の実行を停止する

TKSのヘルプは、これが機能するようになりました:

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

3つの問題:

  • あなたのタイムアウトが1ミリ秒で起動するように設定されている
  • あなたcountは終了しませんので、setTimeoutは達しません
  • あなたalertwhilecount内から呼び出されなければなりません、またはsetTimeoutコールバック内から送信されます。

これらの問題とコードが機能するはずです。それでも、終了日を前に設定し、その日付との比較をwhileに行った可能性があります。

0

私は目的が何であるかを知らないが、あなたはkeepGoingがその間に実行いくつかの他の場所に変更するための機会を与えるためにしばらくの間、

function count() { 
    while(keepGoing) { 
     i = i+1; 
    } 
} 

を中断しなければなりません。また、あなたがこれを行うことはありません:

あなたは完全に すべてのためのスレッドをブロックしている
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のための命令のように、小さなチャンクに分けることができます:)

関連する問題