Last active
December 11, 2015 01:58
-
-
Save kawanet/4527240 to your computer and use it in GitHub Desktop.
This waits 1 msec with jQuery Deferred or with traditional setTimeout.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 何かDOM操作する(この時点ではまだ描画されない) | |
$('#status').text('処理を開始します'); | |
// setTimeoutを使ってDOM描画を待つ | |
setTimeout(function() { | |
// 1ミリ秒後に開始する重い処理 | |
}, 1); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 何か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(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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 オブジェクトと一緒に使いやすい。