$.when().done()

Ajax + JSON + twitter api の最終課題で、 twitter search の複数の結果を一つにまとめるにはどうしたら良いか、という質問があり、 Ajax の結果が返ってくるのは非同期だから、 全部の結果が返って来たというタイミングがいつかというのがわからんとどうにもならん。

TAに調べてもらったら $.when と .done というものがそれであるらしい。

まじめにやるととても複雑 なので、 極力シンプル にしてみた。

$.when(func1, func2,...).done(function(result1, result2,...));

のような書き方をすれば良く、func1 の結果は result1、func2 の結果は result2、という具合に返ってくる。 ただし実際の返り値は result1[0]、result2[0]、のようにして取り出す。

それを concat で連結して sortByDate で時刻順にソートしている。

最後に $.each でその結果を一つずつ表示。

すげえ、jQuery ってすげえ。 しかもこれできるようになったの去年の今頃らしい。 それまでは jsDeffered などというライブラリを使わなきゃいけなかったらしい。

もちょこっと調べてみた。上の result1 とか result2 は配列になっていて、 result[0] がリクエストに対する戻り値(data)。つまり得られるデータの本体。 result[1] はリクエストの状態(textStatus)。リクエストが成功してたら success という文字列が入る。 result[2] は jquery XMLHttpRequestオブジェクト。取得に成功してたら result[2].status に 200という数値(ステイタスコード)が入っている。

XMLHttpRequest というのは非常に紛らわしい名前だ。 なんとなく XML でデータをやりとりしているように思えるが、 もともとは、マイクロソフトXML parser や非同期通信などをまとめたライブラリを MSXML と呼んでいて、それに含まれていたためにそう言われるだけのようである。 だから、XMLHttpRequestJSON を直接受け渡ししたりもする。 XMLJSON は違う、明らかに違う。

ややこしい。 html の script要素でクロスドメインなサイトの javascript を読み込むことができるのは当たり前だが、 javascript から javascript を読み込んむ動的ロードとか、 XMLHttpRequest 使ったりとか、 JSONP とか。 $.getJSON できるのはサーバ側でクロスドメインが可能なように設定してあるだけなんだよね、結局は。

Jqueryメモ これもそうかな。