2011年 01月 31日

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;
};