2013-03-18 11 views
45

バックボーンを2,3週間使用した後で、アンダースコアの遅延が、さまざまなビューをレンダリングする際に遭遇した非同期の問題の多くを修正したことに気付きました。 誰かが私にちょうどアンダースコアの延期が何であるか、$ .ready()や他のタイプのdomが関数をレンダリングするのをどのように違うのかを理解するのを手伝ってもらえますか?それを使用するのはどうですか?なぜ私の問題の多くがアンダースコアで修正されますか?

_.defer = function(func) { 
    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); 
}; 
+0

まあ、 '_.delay'はどうしますか?そこには答えがあります。 –

+0

1ミリ秒待つようです。私はまだ、特定の要素がレンダリングされているなど、その要素が間違って使用されていることを知っている方法を理解できません。 – cesara

+0

'defer'を使用しなければならなかった場所の例を投稿し、その理由を理解していないと、もっと役立つかもしれません。 –

答えて

72
# These are equivalent 
_.defer(fn); 
setTimeout(fn, 1); 

のでdeferは、単純に1ミリ秒setTimeoutです。 は(さらにいくつかの便利な機能を持っているが、それらはここでは重要ではありません。)JavaScriptは、ループを実行している


。それはシングルスレッドですが、その実行はイベントやタイマーに基づいて開始および終了します。 JSエンジンがいくつかのコードを実行するたびに、実行ループの1回の反復が開始されます。

だから、deferは、「次の実行ループでこのコードを実行する」と言います。

_.defer(function() { alert('after'); }); 
alert('before'); 

これは、「前」および「後」を警告します。これは、現在の実行ループが「前」の警告を終了し、その直後に新しい実行ループが開始され、「後」の警告がコードを実行するためです。

いつでもここにコードがありますが、このコードの後に​​発生するコードを実行したい場合は、deferを使用します。

_.defer(functionToRunLast); 
functionToRunFirst(); 

これはDOMを使用すると便利です。時にはそれを変更することもありますが、変更はすぐに解析またはレンダリングされません。実行ループの最後に、ブラウザがキャッチアップしてDOMを解析してレンダリングし、次の実行ループが開始され、新たにレンダリングされたDOMと対話できます。

(シナリオは、私はわからないんだけど、これはDOMの解析を遅らせる原因となるが、私は過去に私自身のプロジェクトでそれを気づいたまさに。)


それはませですDOMの準備ができました。次の実行ループはの前に発生する可能性があります。 DOMの準備ができたら、これらの概念を混同しないでください。

+3

DOMはすぐに更新されるでしょうが、レンダリング(したがってサイジングと位置付けのようなもの)は、ブラウザがコントロールを取り戻すまで一般には起こりません。これは、あなたが追加したばかりのものにGoogle Mapsをバインドしたいときには、しばしば 'defer'(またはそれに相当する' setTimeout')が必要な理由です。マップは大きなものがどれくらいあるか知りたいですが、ブラウザはそれを計算する機会を得る。 –

+0

多くのことに役立つAlexに感謝します! – cesara

+0

_.defer()はsetTimeout(fn、0)とどのように比較されますか? – iamwhitebox

関連する問題