1

重複の可能性:
setTimeout(fn, 0) が時々役立つのはなぜですか?

jQuery 1.8のソースを読んで、

setTimeout を 0 ミリ秒の遅延で実行するのはなぜですか? (コールバックを実行する代わりに?)

https://github.com/jquery/jquery/blob/1.8.0/src/ajax/xhr.js#L196

                if ( !s.async ) {                       
                    callback();
                } else if ( xhr.readyState === 4 ) {


                    // (IE6 & IE7) if it's in cache and has been
                    // retrieved directly we need to fire the callback

         //-------->// WHY do setTimeout with 0 ms delay ?
                    setTimeout( callback, 0 );
                } else {
                    handle = ++xhrId;
4

2 に答える 2

3

これは、コールバックを起動せずにキャッシュから AJAX 結果を取得できる IE6 および IE7 の特性に対する回避策であり、代わりにそのプロパティをXMLHTTPRequestすぐに に設定します。readyState4

ただし、 の API コントラクトで$.ajaxは、非同期要求に対して (つまり、プログラマが提供するコールバックを呼び出さずに) すぐに戻る必要があります。

したがって$.ajax、これらのキャッシュされた結果のテストを呼び出し、必要な非同期コールバックを を使用して偽造しますsetTimeout

呼び出しが完了し、$.ajaxブラウザーがイベント処理ループに再び入るとすぐに、(すぐに期限切れになった) タイマー イベントを見つけて、そのコールバックを呼び出します。

于 2012-08-22T13:06:28.120 に答える
2

その理由は、setTimeout が関数をブラウザー イベント キューに追加するため、キュー内の前のイベントが処理された後にのみ呼び出され、タイムアウトを設定する関数の残りの部分が実行を終了できるようになるためです。

于 2012-08-22T13:05:34.583 に答える