web-dev-qa-db-ja.com

アンダースコアがなぜ私の問題の多くを修正するのですか?

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

_.defer = function(func) {
    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
};
47
cesara
# 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解析の原因になるかはわかりませんが、過去に自分のプロジェクトで気づいていました。)


これは、[〜#〜] not [〜#〜]DOM readyの代替です。次の実行ループが発生する可能性がありますbefore.

74
Alex Wayne