オブジェクトが実行可能になったら実行するなんか
最近、ブログパーツに特化したJSフレームワークを作りはじめている。
んで、createElementなんかでscriptをloadした時とか、いちいちタイミング調整したりしてごにょったりするのが、嫌になって来たので、queueに登録しておいて定期的にチェックするようなのを書いてみた。
setTimeout/clearTimeoutとかevalとか気持ち悪いので、もっといい方法がある気が。
if(typeof Widzzy == 'undefined') var Widzzy = function(){}; Widzzy.library_version = 0.01; if(typeof Widzzy.LazyTask == 'undefined') Widzzy.LazyTask = function(){}; if( typeof Widzzy.LazyTask.version == 'undefined' || Widzzy.LazyTask.version < Widzzy.library_version ) { (function(){ this.version = Widzzy.library_version; this.queue = new Array(); this.interval = 100; this.timer = undefined; //task :{ action: function_object_name, args: array_of_arguments }; this.register = function(task) { this.queue.push(task); var _self = this; this.timer = setTimeout( function(){ return _self.tryExecusion.apply(_self);}, _self.interval ); } this.remove = function(task) { for(var i = 0; i < this.queue.length; i++) if(this.queue[i].method == task.method && this.queue[i].args == task.args) this.queue.splice(i,1); } this.tryExecusion = function() { if(this.timer) clearTimeout(this.timer); var next_queue = []; while(this.queue.length > 0) { var task = this.queue.shift(); var method = this.getMethod(task.action); if(method) { var obj = this.getBindTarget(task.action); method.apply(obj, task.args); } else { next_queue.push(task); } } if(next_queue.length > 0) { this.queue = next_queue; var _self = this; this.timer = setTimeout( function(){ return _self.tryExecusion.apply(_self);}, _self.interval ); } } this.getMethod = function(name) { var method; try { method = eval(name); } catch(e) { method = undefined; } return method; } this.getBindTarget = function(name) { var objName = name.replace(/.[^.]+$/,''); var obj; try { obj = eval(objName); } catch(e) { obj = window; } return obj; } }).apply(Widzzy.LazyTask); }
使い方は、こんな感じ。Firebugのコンソールとかで試した方が多分わかりやすい。
Widzzy.LazyTask.register({action: 'Foo.bar',args:[1,2]}); var Foo = function(){}; (function(){ this.baz = 3; this.bar = function(a,b){ console.log(a + b + this.baz);}}).apply(Foo);
しばらくコレに割く時間があまり取れなさそうなので、途中で晒してみた。feedbackとかあると嬉しいです。