2017-04-27 23 views
1

私はこの非同期コードで遊んでいましたが、setTimeoutの1ms後にコールバックが実行されることが予想され、valの値はその時の値になるため試しましたコールバックの実行まで、1ミリ秒の遅延を克服することを望んでいるvalの再割り当てを増やしてください。しかし、valの何回の再割当てにかかわらず、valの値は常に最後の割り当ての1つです。だから問題は、これらのすべての再割り当てがすばやく行われてコールバックを実行する前に1msで十分であるか、ここで何か不足しているということですか?非同期コードの実行

function asyncFunction(callback) { 
     setTimeout(callback, 1); 
    } 

    var val= '1'; 

    asyncFunction(function() { 
     console.log('The value is ' + val); 
    }); 
    val= '2'; 
    val= '3'; 
    //... 
    //... more asignments 

    val = '1000' 

答えて

3

JavaScriptがは何かを行うには現在実行中の機能を中断することはありません。

あなたはsetTimeoutに関数を渡す場合、次の条件のすべてに該当する場合、それが呼び出されます:指定した時間が

  • を通過した

    さらに読み取りを実行中に他の機能ではありません3210

  • 0

    MDN - Reasons for Delays longer than specifiedをお読みください。


    関数またはコードスニペットは、setTimeout()を呼び出したスレッドが終了するまで実行できないことに注意してください。たとえば:

    function foo() { 
        console.log('foo has been called'); 
    } 
    setTimeout(foo, 0); 
    console.log('After setTimeout'); 
    

    がコンソールに書き込まれます:

    After setTimeout 
    foo has been called 
    

    のsetTimeoutがゼロの遅延で呼ばれていたにもかかわらず、それはキューに置かれ、次の機会に実行するようにスケジュールだからすぐにではありません。キュー上の関数が実行される前に現在実行中のコードが完了する必要があります。その結果、実行順序が期待どおりにならないことがあります。

    関連する問題