51

バックボーンを数週間使用した後、アンダースコアの延期により、さまざまなビューのレンダリングに関して発生した非同期の問題の多くが修正されることに気付きました。誰かがアンダースコアの延期が何をするのか、そして$ .ready()や他のタイプのdomが関数をレンダリングするのを待つのとどう違うのかを正確に理解するのを手伝ってくれませんか?それを使用することの欠点は何ですか?

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

1 に答える 1

75
# 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レディが起動する前に発生する可能性があります。これらの概念を混同しないでください。

于 2013-03-19T00:10:06.690 に答える