2

私は頭を包み込み、シングルスレッドブラウザ環境でjavascript asyncがどのように機能するかを理解しようとしています。

非同期として、タイマーと xhr リクエストの両方を処理できます。今、私は以下のようなものを持っているとします

function doStuff() {
    for(var i=0; i<100000000; i++) {
        // do something to make proc busy
        if(i%1000 === 0) {
            console.log('in for loop');
        }
    }
}


setTimeout(function() {
    console.log('timed out')
}, 2);
doStuff();
doStuff();
doStuff();

タイマーは非常に小さい値 (2ms) に設定されているため、次のように動作するはずです。

1) タイマー コールバックがキューに入れられる

2)doStuff()が実行されます (全体として?)、時間がかかります (2 ミリ秒以上)

doStuff()3) ある実行と別の実行の瞬間があるため、タイマー コールバックが実行されます。

4) 次にdoStuff()呼び出される

4) 最後doStuff()に呼び出される

代わりに、doStuff()タイマー コールバックが発生する前に 3 つのすべての処理が行われていることがわかります。そして、それはそれらの 2ms よりもはるかに長い時間です。はい、この時間の設定値setTimeoutが保証されないことは承知しています。

私の質問は、javascript がどのようにコードを実行するかです。非同期キューから何かが呼び出される前に一度に実行される最小の原子ブロックは何ですか?

4

3 に答える 3

5

あなたはここで間違っています:

3) ある doStuff() の実行と別の実行を交互に行う瞬間があるため、タイマー コールバックが実行されます。

その理由は、次の質問に対する答えにあります。

非同期キューから何かが呼び出される前に一度に実行される最小の原子ブロックは何ですか?

JavaScript は、イベント ループと呼ばれるものを使用します。各イベント ループ サイクルは「ティック」と呼ぶことができます。ティックごとに、インタープリターは実行する非同期コールバックがあるかどうかをチェックします (たとえば、setTimeoutタイムアウトがすでに期限切れになっているコールバック)。

他のすべての同期操作は、同じティック内で行われます。したがって、あなたの例では、次のティックでタイマーの有効期限がチェックされますが、3 つの呼び出しはすべて現在のティックdoStuffで実行されます。に渡される時間値が保証されていないのはそのためです。次のティックまでにかかる時間を知る方法がないため、通常、コールバックは「できるだけ早く」実行されると言います。の場合、一部のコールがドロップされることさえあります。たとえば、定義された間隔の 2 倍の後に次のティックが発生した場合、コールバックは 1 回だけ実行されます。setTimeoutsetInterval

于 2013-01-16T22:07:24.667 に答える
3

Javascript はシングル スレッドであるため、タイムアウトはインタープリターがアイドル状態になったときにのみ処理できます。タイムアウト関数をキューに入れるまでに、インタープリターはまだメイン スクリプトを処理しており、終了するまでタイムアウトを処理できません。

setTimeoutまたはsetInterval、その他の非同期イベントは、コードが実行されていないときにのみ処理されます。それらは現在のコードを中断しません。ブロックする実行中の JavaScript コードは、すべてのイベント ハンドラの実行を遅らせます。

于 2013-01-16T22:03:20.510 に答える
0

WebWorker は、Async Javascript の更新されたソリューションです。sencha 開発者向けのチュートリアルはここにありますが、まだ setTimeout に依存していません。

于 2014-01-31T12:36:43.323 に答える