JavaScriptで,特定の条件が満たされるまで待ってから実行したい,ということがあると思う.
条件の部分が自分で触れるコードならイベントを発行するようにして,イベントハンドラを設定すればできるけど,外部のスクリプトなんかだと,拡張しにくい.
タイマーで定期的にチェックして,条件が満たされていれば実行する,というのを書いた.
var wait_for = function(check, main, interval) { var is_rejected = false; var pull = function() { if (is_rejected) return; if (check()) { main(); return; } setTimeout(pull, interval || 500); }; pull(); return function() { is_rejected = true; }; };
これで,2秒後にaがtrueになって,a = trueって表示される.
var a = false; wait_for(function() { return a; }, function() { console.log('a = true'); }); setTimeout(function() { a = true; }, 2000);
rejectする関数を返す.先に呼ぶと本体が実行されない.以下はa = trueって出ない.
var a = false; var reject = wait_for(function() { return a; }, function() { console.log('a = true'); }); setTimeout(function() { reject(); }, 1000); setTimeout(function() { a = true; }, 2000);
jQuery Deferredを使うやつ.こっちのほうがいいかもしれない.
var wait_for_deferred = function(check, interval) { var dfd = $.Deferred(); var pull = function() { if (check()) { dfd.resolve(); return; } setTimeout(pull, interval || 500); }; pull(); return dfd; };
var a = false; var d = wait_for_deferred(function() { return a; }).done(function() { console.log('a = true'); }); setTimeout(function() { d.reject(); }, 1000); setTimeout(function() { a = true; }, 2000);