2007年 12月 01日

jQuery Deferred

http://svn.coderepos.org/share/lang/javascript/jquery-deferred/sample.html
http://jquery.com/plugins/project/deferred

いろいろサンプル書いてつかいみちを考えているとたのしい。

var list = [];
list.push($.get("a.html").next(function (data) { return data.match(/<title>([^<]+)<\/title>/) } ));
list.push($.get("b.txt" ).next(function (data) { return data.match(/##\s*([^<]+)\s*##/) } ));
list.push($.getJSON("c.json").next(function (data) { return data.title } ));

parallel(list).next(function (values) {
	print("Titles "+values.join(", "));
});

みたい書ける。たのしい。(うえのコードがうごくかはためしてない)

それぞれ、べつべつのフォーマットのリソースをとってくる。タイトルを抽出するところまでは個々の Deferred が処理して、そいつらを parallel (DeferredList) であつめてくる。

でもそういうふつうの (謎) 非同期処理より、ループの分割のほうがおもしろい。

loop({begin: 1, end:100, step:10}, function (n, o) {
	print(["Processing devided loop:n=", n].join(""));
	for (var i = 0; i < o.step; i++) {
		var j = n + i;
		print(j);
	}
});

function print (m) { $("#loop-code1").append("\n// "+m) }

1 から 100 までをループする。ただし最大 10 個に制限して分割してループする (o.step を条件にしているのは、境界付近でよしなにするため。最後 (o.last == true) 以外は常に渡した step と一緒)。定期的にブラウザに処理がもどるので固まったようにならない (100 ぐらいじゃ固まらないけど)。固まりさえしなければある程度時間がかかってもストレスがたまらないから嬉しい。

ディレイいれながらループも簡単にかける

loop(5, function (i, o) {
	print(i);
	return o.last? i : wait(1);
}).
next(function (e) {
	print("end ["+e+"]");
});

1秒ずつまちながら 5 回ループする (0,1,2,3,4)

最後の値を次へ渡したいので条件をいれてる。end [4] と最後にでる。