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だって、へっちゃらのはず。