Array.prototype.eachLater
LDRで使われている、Function.prototype.later(via *「ふっかつのじゅもんがちがいます。」)にインスパイアされて、Array.prototype.eachLaterを書いてみました。
Array.prototype.eachLater = function(ms,call,callback,ob){ var self = this; var obj = ob || typeof(callback) != 'function' ? callback : null; var res = { complete: false, cancel: function(){ clearInterval(PID); }, notify: function(){ clearInterval(PID); if (endCallback && typeof(endCallback) == 'function') callback.call(obj,self); } }; var len = self.length; var i = 0; var PID = setInterval(function(){ try{ call.call(obj,self[i],i); } catch (e) { } finally { i++; if (i >= len) { clearInterval(PID); res.complete = true; if(callback && typeof(callback) == 'function') callback.call(obj,self); } } },ms); return res; } // Arrayを汚染しないようにするなら、こっち var eachLater = function(arr,ms,call,callback,ob) { var self = arr; var obj = ob || typeof(callback) != 'function' ? callback : null; var res = { complete: false, cancel: function(){ clearInterval(PID); }, notify: function(){ clearInterval(PID); if (callback && typeof(callback) == 'function') callback.call(obj,self); } }; var len = self.length; var i = 0; var PID = setInterval(function(){ try{ call.call(obj,self[i],i); } catch (e) { } finally { i++; if (i >= len) { clearInterval(PID); res.complete = true; if(callback && typeof(callback) == 'function') callback.call(obj,self); } } },ms); return res; }
配列を時間差で処理するだけの簡単な関数です。
var arr = [1,2,3]; arr.eachLater(1000,function(a){console.log(a);});
とりあえず、やろうとしていたことはこれで実現できたので公開。
使ってるうちに改良していくと思います。