JavaScriptはタイマーに基づく擬似スレッド機構


以前のブラウザでJavascriptコードの実行に関する制限文章では、5つのブラウザがjavascriptコードの実行時間が長い時にどうするかを述べました.ブラウザの挙動は変えられません.バックエンドサーバを削除するプロセスもキャンセルできません.ただし、タイマーはブラウザのブロックを必要とせずに長期的な動作を実現するのに役立ちます.
タイマーとは?
JavaScriptコードでは、各関数は、ある時刻以降に設定されます.
  • setTimeout(function,msec[,arg 1...argN])は、この関数を数ミリ秒後に実行します.後のパラメータは実行する関数に渡されます.
  • setInterval(function,msec[,arg 1...argN])は、setTimeoutに類似しています.これは数ミリ秒ごとに実行されます.
  • もう2つの方法があります.clearTimeout()とclear Interval()は、タイマーをクリアすることができます.
       
       
       
       
    var timerID = setTimeout(myfunction, 500 );
    clearTimeout(timerID);
    注意したいのは:
  • setTimeoutとsetInteralは、関数に一つの参照を伝達します.setTimeout(myfunction(500)のようなコードは、直ちにこの関数を実行します.
  • ミリ秒はそんなに正確ではありません.彼はブラウザのプロセスが暇な時だけ正確に時間通りに実行します.
  • は、あまりこのような実行順序に依存しないでください.setTimeout(f 1,50)、setTimeout(f 2,50)、f 2()が先に実行される可能性があります.
    タイマーによる実行
    タイミングコードはすぐに実行されません.このようにブラウザでは他のこともできます.したがって、長いタスクをいくつかの部分に分けて実行することもできます.
    簡単な空腹例を挙げて、私達を加えて順番にf 1()、f 2()、f 3()を実行したいです.
       
       
       
       
    function ProcessThread(func) {
    var ms = 20 ;
    setTimeout(
    function () {
    func.shift()();
    if (func) {
    setTimeout(arguments.callee, ms);
    }
    }, ms);
    }
    ProcessThread([f1, f2, f3]);
    func.shift()は何ですか?
    ここでは説明が必要です.func.shift()は配列の最初の要素を除去してこの要素に戻ります.ここで返したのは関数です.だから、括弧を使ってそれを実行します.var f=func.shift();f()と同じです.
    Process Threadは、伝達されたすべての関数を順次実行しますが、20 msの距離があります.いくつかの関数は、順番に実行されます.どのプログラムがないと「unreponsive script」エラーが出ますか?
    もちろん、この方法は大きなデータを扱う時に役に立ちます.