2013-08-29 1 views

答えて

10

これを行う理由は、JavaScriptスレッドがキュー内で待機している可能性のある他のイベントをトリガーできるようにするためです。

Javascriptはシングルスレッドです。イベントがトリガされると、現在実行中のコードが終了したときにのみ実行されます。

ゼロ時間遅延を使用してsetTimeoutを使用すると、callback関数呼び出しが新しいコンテキストの一部であり、現在のコードブロックが終了していることがJSインタープリタに効果的に伝えられます。これは、JSが機会を取ってcallback()に電話して、他のイベントを処理する必要があるかどうかを確認することを意味します。

これはすぐに、これはあなたのサイトの全体的なパフォーマンスのために良いことができますと呼ばれているからcallback()自体を遅らせるかもしれないが:処理する必要があるかもしれない

その他のイベントは、イベントや他のUIのトリガーをクリックします。実行する機会を与えないと、ユーザインタフェースが遅くなったり反応しなくなったりすることがあります。

2

setTimeoutcallback();よりかcallback.call();の実行により、ループ内の関数を呼び出すの間で異なっている何setTimeout

resolve: function (data) { 
    this.promise.okCallbacks.forEach(function(callback) { 
     window.setTimeout(function() { 
     callback(data) 
     }, 0); 
    }); 
    }, 

JavaScriptプロセスは無料です。

callを使用すると、すぐにコールバックが実行され、他のすべてがブロックされます。

+0

に設定されていますが、時刻は0に設定されています。 –

+0

@ Moein7tl:実際には、タイムアウトの下限は0より大きくなります(IIRCは一般的なブラウザでは4ミリ秒です)。したがって、0は「あなたがそれに慣れるとすぐに」という意味です。おそらくゼロタイムアウトを使用している人はこれを知っていて、それを意図的にやっているでしょう。 – Jon

+1

@ Moein7tl - はい、「時間が経過した」と言った後、私は**と**を言ったことに注意してください。 – Quentin

2

setTimeout(func,0)はすぐに呼び出されません。

単純にコールバック付きの非同期関数をシミュレートします。 setTimeout()で実行される

function asyncFunc(callback) { 
    console.log("step1"); 
    setTimeout(callback,0); 
    console.log("step2"); 
} 

asyncFunc(function() {console.log("async step")}); 
/* output: 
step1 
step2 
async step 
*/ 

https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout

コードは、それはそう、それは個別の実行コンテキストで実行されます

呼び出された関数に個別の実行コンテキストで実行されます実行する前に、javascriptは、シングルスレッドで実行されているjavascriptのため、現在の実行を終了する必要があります。

他のタスクを実行する前に終了しなければならないので、現在の実行中の時間は関係ありません。

たとえば、コールバックが呼び出されないなど、タスクが終了する前に無限ループが発生した場合は、

1

setTimeout()は、指定された時間が経過した後に1回呼び出される関数を登録できます。

WindowオブジェクトのsetTimeout()メソッドは、 の指定されたミリ秒数が経過した後に実行する関数をスケジューリングします。 setTimeout()clearTimeout()に渡された の値を返して、スケジュールされた機能の実行を取り消します。

時刻が0msのsetTimeout()を呼び出すと、指定した関数はすぐに呼び出されません 。代わりに、 の後に "できるだけ早く"呼び出されるキューに配置され、現在保留中のイベントハンドラの実行が終了します。

関連する問題