2009-06-24 3 views
5

次の行がシステムによって読み込まれる前に、どうすればjavascriptでスリープ状態にすることができますか?どのようにjavascriptで睡眠をするには?

例:この例では

1 var chkResult = Validation(); 
    2 //sleep here for for 10 sec before the next line been read  
    3 
    4 document.getElementById('abc').innerHTML = chkResult; 

、どのように私はそれが4行目を読み続けて前にjavascriptの睡眠が/ 10秒間のライン2で待つことができますか?私はsetTimeout( ''、10000)を試みました。それはまだ私のために働いていないようですですが...

+0

睡眠はそれが原因となりますように悪い考えになる前に、あなたの行ラインが実行されますがブラウザのUIが応答しなくなる – cobbal

+0

10秒間の検証を心配しています。サーバーが応答するのは時間ですか?あなたがAJAX呼び出しで検証を行っている場合は、とにかくコールバックを取得してはいけませんか? – Nosredna

答えて

16

I Have the Hatは正しいヒントを与えています。 10秒後に述べラインのコードを実行するsetTimeout methodを使用します。

var chkResult = Validation(); 
var timeout = window.setTimeout(function() { 
    document.getElementById('abc').innerHTML = chkResult; 
}, 10000); 

変数にタイムアウトIDを保存あなたはclear a timeoutする場合は便利です。

5

は、最初の引数は、関数を期待

setTimeout(function() { return true; }, 10000); 

を試してみてください。これはメモリからのものです。私はそれをテストしていない。

編集: Gumboが言ったことは...遅いところです...私が何を考えているのかわかりません。

+0

実行する関数または文字列を与えることができます。 https://developer.mozilla.org/en/DOM/window.setTimeout – Gumbo

+0

を参照してください。ありがとう。 –

+0

文字列は、評価を行うのと同等であるため、一般的には嫌われますが、両方の方法が機能します。 – Nosredna

2

setTimeoutは、JavaScriptインタープリタ内で別の実行「スレッド」を開始します。その関数に関数を渡して、関数をsetTimeoutが実行するようにスクリプトを設計する必要があります。これは、呼び出し関数が中断された場所で継続するため、スリープをシミュレートします。

1

JavaScriptがブラウザに制御を戻さない限り、遅延が発生しないので、setTimeoutが始まる前に4行目が実行されます。

すべてのイベントをイベントに基づいて行う必要があります。

0

私は、一般的な解決策としてこれを提案することができる:使用の

function sleep (ms, args, obj) { 
    /* Called at the top of a function to invoke a delay in processing that 
     function 

     Returns true if the function should be executed, and false if the sleep 
     timer is activated. 

     At the end of the sleep tiemout, the calling function is re-called by 
     calling it with "apply (obj, args || [])". 
    */ 

    var caller = sleep.caller; 
    if (caller.sleepTimer) { 
     /* if invoked from timeout function, delete timer and return false */ 
     delete caller.sleepTimer; 
     return true; 
    } 

    /* Create timer and re-call caller at expiry */ 
    caller.sleepTimer = window.setTimeout (function() { 
     caller.apply (obj || null, args || []); 
    },ms); 

    return false; 
    }  

例:オペラとFirefoxでテスト

function delayed() { 
    if (!sleep (5000)) return; 

    document.body.innerHTML += "<p>delayed processing</p>"; 
} 

function delayed_args (a, b) { 
    if (!sleep (10000, arguments)) return; 

    document.body.innerHTML += "<p>args : (" + a + ", " + b + ")</p>"; 
} 

function delayed_method_args (a,b) { 
    if (!sleep (20000, arguments, this)) return; 

    document.body.innerHTML += "<p>method_args " + this + " (" + a + ", " + b + ")</p>"; 
} 

3.0

3
1 var chkResult = Validation(); 
    2 alert("wait ten seconds, then press ok"); 
    3  
    4 document.getElementById('abc').innerHTML = chkResult; 

先行コードを委譲睡眠タスクを並列プロセッサに転送します。このスタイルのスレッドにはDSLを使用する必要があるため、これはちょっと面倒です。

+0

ルルツ+1。 – anddoutoi

0

Javascriptはスレッドをブラウザと共有する必要があります。そのため、ブラウザが10秒間フリーズしたように見えます。 「アラート」や「プロンプト」などの機能がこれを行います。このため、ループ内の単一のアラートがブラウザ全体を無意味にする可能性があり、強制的に終了させる唯一の方法があるため、それらは悪です。

この問題を回避する方法は、イベントベースのパラダイムです。 Javascriptにはファーストクラスの関数があるため、特定のイベントに割り当てることができる「コールバック」の値として渡すことができます。

setTimeoutはそのようなイベントの1つです。他の人はコードを投稿していますが、一般的には、特定のイベントに関数を割り当ててから、ブラウザから抜け出してブラウザービジネスを行うことができます。ブラウザは何かが起こった時にあなたに知らせます、そして、あなたは応答してすぐに適切な何かをすばやくしてから、やり直してください。このようにして、ブラウザは応答性の外観を維持することができます。

あなたは、もっと知りたいこの質問を見ている場合: How is GUI and Game Program Flow compared to Web programs

0

が、この方法をJavaScriptでライン4