7

関数を一定の秒数実行してから終了する必要があります。jQueryまたはWebワーカーを使用できましたが、それを直接実行しようとして失敗しました。

これが機能するようになりました。

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

カウントは無限ループを開始し、コードがsetTimeout()に到達することはありません。

于 2013-03-05T15:45:26.567 に答える
1

3つの問題:

  • タイムアウトは1ミリ秒で起動するように設定されています
  • 決して終わらsetTimeoutないのであなたは到達されませんcount
  • の後に、またはコールバック内から呼び出すalert必要があります。countwhilesetTimeout

これらの問題に対処すれば、コードは機能するはずです。それでも、事前に終了日を設定し、でその日付と比較した可能性があります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 に答える