hitode909の日記

以前はプログラミング日記でしたが、今は子育て日記です

条件が満たされるまで待ってから実行するやつ

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);