Skip to content

Instantly share code, notes, and snippets.

@kawanet
Last active December 11, 2015 01:58
Show Gist options
  • Save kawanet/4527240 to your computer and use it in GitHub Desktop.
Save kawanet/4527240 to your computer and use it in GitHub Desktop.
This waits 1 msec with jQuery Deferred or with traditional setTimeout.
// 何かDOM操作する(この時点ではまだ描画されない)
$('#status').text('処理を開始します');
// setTimeoutを使ってDOM描画を待つ
setTimeout(function() {
// 1ミリ秒後に開始する重い処理
}, 1);
// 何かDOM操作する(この時点ではまだ描画されない)
$('#status').text('処理を開始します');
// jQuery Deferredを使ってDOM描画を待つ
wait(1).then(function() {
// 1ミリ秒後に開始する重い処理
});
// 指定されたミリ秒を待つ関数
function wait(ms) {
var dfd = $.Deferred();
setTimeout(function() {
dfd.resolve();
}, ms);
return dfd.promise();
}
@kawanet
Copy link
Author

kawanet commented Jan 14, 2013

JavaScriptでDOM操作をした時点ではその変更内容はブラウザの描画には反映されず、
JSの処理が終わって、UIスレッドに制御が渡った時点で実際に描画される。

例えば、処理開始のメッセージを画面に表示してから重い処理を行う場合、
DOM操作後にいったんsetTimeoutでUIスレッドに制御を渡さなければ、
実際にそのメッセージが描画されるのは処理が全て終わった後になってしまう。

そこで setTimeout で一瞬だけ UI スレッドに制御を返す方法が使われてきた。(setTimeout.js)

JSDeferred だと、指定秒数を待つ wait 関数が提供されていた。
http://cho45.stfuawsc.com/jsdeferred/doc/Deferred.html#Deferred.wait

jQuery の DOM 関係では delay() 関数があるけど、jQuery Deferred にはないのかね?

jQuery Deferred でも指定ミリ秒を待つ wait 関数は7行で書ける。(wait-then.js)
setTimeout よりも見た目で分かりやすく、他の Deferred オブジェクトと一緒に使いやすい。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment