JSDeferred の setTimeout 版の効率あげた版
setTimeout() を毎回やると、ブラウザ内部でタイマーオブジェクトが大量にできるんだろうなー とは思いつつ、そんなのの効率化ってブラウザ側でやるべきことでしょ? という感じなのでナイーブな実装にしていたのだけど、一応タイマーをできるだけ作らないバージョンもつくってみた。けどやっぱあんまり意味なかった (Opera では意味あるかもしれない)
Deferred.next_default = function me (fun) {
if (!me.nextTicks) me.nextTicks = [];
if (!me.timer) {
me.timer = setInterval(function () {
if (me.nextTicks.length) {
for (var i = 0, len = me.nextTicks.length; i < len; i++) {
me.nextTicks[i].call();
}
me.nextTicks = me.nextTicks.slice(len);
} else {
clearInterval(me.timer);
me.timer = null;
}
}, 1);
}
var d = new Deferred();
me.nextTicks.push(d);
if (fun) d.callback.ok = fun;
return d;
};