結果を待って実行

Deferrdはまだ見てないんだけど、適当に作ってみた。

function execWhen(cond, proc, opt) {
    var opt = opt ? opt: {}
    var limit    = opt.limit || 10000
    var interval = opt.interval || 500
    var current  = 0
    var timer    = null
    intervalProc()

    function intervalProc() {
        if (cond()) {
            proc()
	    clearTimeout(timer)
        }
        else if (current < limit) {
	    timer = setTimeout(intervalProc, interval)
	    current += interval
	}
	else {
	    clearTimeout(timer)
            throw new Error('timeout')
	}
    }
}

こんな感じに使う。

var list = []
setTimeout(function() {list.push('A')}, 500)
setTimeout(function() {list.push('B')}, 1000)
setTimeout(function() {list.push('C')}, 2000)

var cond = function() {return list.length >= 3}
execWhen(cond, function() {
    // ここに処理を書く
    console.log(list)
    list.forEach(function(i) {
        console.log(i)
    })
})

もっとスマートな方法もありそうだけど、まあいいや。


これで非同期オンリーなGM_xmlhttpRequestだって、へっちゃらのはず。