jQuery.Defferredを使うと、イベントキューを管理しなくても、メソッドに書けばよくなって便利になる。
sleep関数を実装する。
定番のSleepを実装する
var wait_time = function(time){ return (function(){ var dfd = $.Deferred() setTimeout(function(){ console.log("resolve#wait_time("+time+") ");dfd.resolve(); }, time); return dfd.promise() }) }
sleep 起動
var sleep = wait_time(200) $.when(sleep) .then(wait_time(200)) .then(wait_time(201)) .then(wait_time(202)) .done(function(){ console.log("done") })
再帰ループ作ってみる
function main(){ var d = jQuery.Deferred(); d.then( $.get("./") ).then(wait_time(200)).done( main )//再帰ループ d.resolve(); return d.promise(); } main()
ポーリング処理も出来る
WebSocket代替にはちょうどいいかも?
var on_data_recicieve = function(data){ //do something() } function main(){ var d = jQuery.Deferred(); d.then( $.get("./") ) .then(on_data_recicieve) .then(wait_time(200)) .done( main )//再帰ループ d.resolve(); return d.promise(); } main()
setTimeoutのコールバック中で resolveされない限り done の引数の 再帰main が評価されないので、スタックが深くならず無限ループが成立する。
setIntervalだとコールバックの終了待ちが面倒だったのでこの方がスッキリ書ける気がする。
なるほど、Deferred便利だ。