2011-02-02 3 views
0

前のイベントがまだ処理を終えていない場合、Javascriptの後続のイベントをどのように処理しますか?前のイベントがまだ処理を終えていない場合、Javascriptで後続のイベントをどのように処理しますか?

onkeyupイベントが定義されたテキストボックスがあります。イベントが発生すると、ほとんどの状況で次のonkeyupイベントが発生するよりも処理に時間がかかる関数を呼び出します。

onkeyupイベントを中断/放棄して次のイベントを開始する方法はありますか?

あなたはこの線に沿って何かを行うことができます
+0

長期実行プロセスを呼び出すために 'setTimeout'または' setInterval'を使用していると仮定します。それを避けることはできますか?たぶん、いくつかのコードを表示します。 –

答えて

0

JavascriptはGUIのように機能するので、2つのイベントは同時に処理されません。

私の意見では処理が重すぎる場合、最適な解決策は小さなステップで実行できるように変更することです。次に、キーアップイベントが発生したら、最初のステップを実行するだけで、各ステップは012遅延を伴うsetTimeout呼び出しを実行して次のステップをトリガーします。

このように計算を再開するのは簡単です。

タイムアウトが常に優先順位が最も低い(つまり、別のキーアップがある場合はすぐに処理され、前のタスクを続行せずに計算を再開するため)

0

var isRunning = false; 
var i = 0; 
function runFunc() { 
    i++; 
    if (isRunning == false) { 
     isRunning = true; 
     keepRunning(); 
    } 
} 
function keepRunning() { 
    while (i > 0) { 
     realProcessing(); 
     i--; 
    } 
    isRunning = false; 
} 
var el = document.getElementById('field'); 
el.onkeyup = runFunc; 

keepRunningを()実際の処理機能を実行し続けますからkeyupイベントなどなど、多くの時間が を解雇された、私は私の心を、これをオフに書いて、テストしていませんそれは(私には恥)、しかしあなたはおそらくあなたの結果(または同様のもの)を達成することができますこの方法。
ps:私はまだあなたが上記のコードと並行性の問題を抱えていると思います。これらの人(または並行性の問題がないことを私に証明してくれる人)のソリューションを見つけることに非常に興味があります。

+0

他の行がある場合は、あるイベントの処理をスキップしたいと気づきました。申し訳ありませんが、以前は表示されませんでした。 1つのアイデアは、イベントを配列にプッシュし、ループをkeepRunning内で実行するとイベントのキューとして最初から削除し、i> 1の場合は最初のイベントをスキップします。 –

関連する問題