2009-07-26 3 views
51

Javascriptコードに約100ミリ秒の遅延を追加する必要がありますが、windowオブジェクトのsetTimeout関数を使用したくないため、ビジーループを使用したくありません。誰にも何か提案はありますか?遅延をJavaScriptに入れよう

+15

のsetTimeoutが適切でない理由を説明することができます/あなたのニーズを満たしていないのですか? – eyelidlessness

答えて

110

は残念ながら、setTimeout()は、UIをブロックすることなく、スクリプトの実行を一時停止するだけ信頼できる道(いない唯一の方法が、唯一信頼できる方法)です。

それは、ハードを実際に使用することはありません代わりに、これを書いている:

var x = 1; 

// Place mysterious code that blocks the thread for 100 ms. 

x = x * 3 + 2; 
var y = x/2; 

あなたはそれをこのように書き換えることsetTimeout()を使用します。

var x = 1; 
var y = null; // To keep under proper scope 

setTimeout(function() { 
    x = x * 3 + 2; 
    y = x/2; 
}, 100); 

私はsetTimeout()を使用すると、より多くの思考を伴うことを理解し望ましいsleep()機能ですが、残念ながら後者は存在しません。このような機能を実装しようとする多くの回避策があります。使用中のループを使用するもの:

using an XMLHttpRequest tied with a server script that sleeps for a amount of time before returning a result

残念ながら、これらは回避策であり、他の問題(フリーズブラウザなど)が発生する可能性があります。推奨されている方法である「setTimeout()」を貼り付けることをお勧めします。

+2

スリープ機能や他の無意味なタイトループのような機能を使っている人のためにノートパソコンでNoScriptを使用しています。それ以外の場合は、突然私の膝の穴を燃やす。 –

+3

** @ James M.::*完全に合意しました。なぜ、setTimeout()の周りにこのような大きな悪影響があるのか​​理解できませんでした。 –

+2

私はsetTimeout()がそれを取り巻く何かを持っているとは思っていません。 たとえば、ブラウザのロックを回避するために、処理が集中しているループでプロセッサを短時間アイドル状態にしたい場合などです。経験の浅いJavaScriptプログラマにとって、この結果をsetTimeoutで達成することは難しいでしょう。 – KingRadical

2

This threadは良い議論と有益なソリューションを持っています

function pause(iMilliseconds) 
{ 
    var sDialogScript = 'window.setTimeout(function() { window.close(); }, ' + iMilliseconds + ');'; 
    window.showModalDialog('javascript:document.writeln ("<script>' + sDialogScript + '<' + '/script>")'); 
} 

は、残念ながら、IEの一部のバージョンでは動作しないことが表示されますが、それがあることが判明した場合、スレッドは、他の多くの立派な提案を持っていますあなたのための問題。

+2

問題を待っている解決策のようです。私は、 'setTimeout'がその仕事をしない単一の状況について考えることはできません。しかし、創造性は+1です。 :) –

3

実際にはsetTimeoutのみがそのジョブで問題ありません。通常、特定されていない方法でビジーループとして正確な遅延を設定することはできません。

+0

setTimeoutでjsインタプリタを一時停止することはできません。 –

+0

遅延の後に関数を呼び出すことができます。 setTimeoutは 'ブロッキング'ではありません。残りのコードは、想定されているとおりに動作します。 –

11

私はこの問題を適切に解決する必要があっただけです。

Ajax経由で、スクリプトはX(0-10)メッセージを取得します。 私がしたかったこと: 10秒ごとに1つのメッセージをDOMに追加します。

私がなってしまっコード:

$.each(messages, function(idx, el){ 
    window.setTimeout(function(){ 
    doSomething(el); 
    },Math.floor(idx+1)*10000); 
}); 

基本的には、スクリプトの「タイムライン」としてタイムアウトを考えます。

これは、私たちがコードに何をしたいです:

DoSomething(); 
WaitAndDoNothing(5000); 
DoSomethingOther(); 
WaitAndDoNothing(5000); 
DoEvenMore(); 

これは我々がJavaScriptにITを伝える必要があります方法です:

At Runtime 0 : DoSomething(); 
At Runtime 5000 : DoSomethingOther(); 
At Runtime 10000: DoEvenMore(); 

・ホープ、このことができます。

+0

SetTimeOutの動作を説明してくれてありがとうございました。問題は、後でコードが長くなる、またはサーバーの応答に依存する場合に、実際のタイムラインを秒単位で視覚化することも難しくなります。 –

-5

phpページを同期して呼び出すAJAX関数を使用し、そのページで遅延として機能するphp usleep()関数を置くことができます。

function delay(t){ 

var xmlhttp; 

if (window.XMLHttpRequest) 

{// code for IE7+, Firefox, Chrome, Opera, Safari 

xmlhttp=new XMLHttpRequest(); 

} 

else 

{// code for IE6, IE5 

xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 

} 

xmlhttp.open("POST","http://www.hklabs.org/files/delay.php?time="+t,false); 

//This will call the page named delay.php and the response will be sent to a division with ID as "response" 

xmlhttp.send(); 

document.getElementById("response").innerHTML=xmlhttp.responseText; 

} 

http://www.hklabs.org/articles/put-delay-in-javascript

+4

コードを読み込み可能にフォーマットしてください。 – kleopatra

+9

ウェブデザインの基本を忘れないでください。基本的な原則はできるだけサーバー負荷を軽減することです。シンプルな時間遅延のために、サーバーからのページを無限に要求しています。ここで何をやっているのか考えてみてください。 –

関連する問題