JSDeferredとは。JSDeferredが解決することJavaScriptにおける非同期処理の問題点JSDeferredを使うちなみにJSDeferredは何を解決しないかクロスブラウザのためのライブラリではない「書き方」を変えるだけどうもはじめまして、株式会社はてなのid:cho45です。これから数回に渡り、拙作のJavaScriptのライブラリであるJSDeferredの紹介と、それに関係するJavaScriptにおける非同期の技術に関して解説させていただきます。確認程度に、非同期処理がどういうものかを解説しておきます。先に乱暴にまとめてしまうと、以下の事柄が大切なところです。非同期処理は絶対に同期処理にすることができないJavaScriptにおける非同期処理をいくつか例に出すと、以下のようなものが挙げられます。alert('async!');};alert('hello');これらは、すべて非同期で処理されるものです。表示されることで確かめられます。コールバック関数を渡す関数は非同期になっていることも多いですが、同期的に実行されるようなものもあるので、コールバックをとるかどうかではなく、実行順で判断します。JavaScriptはシングルスレッドなので、非同期的に呼ばれるコールバックを登録する関数を呼ぶと、そのコールバックは必ず現在の実行されている関数が終わったあとに呼びだされます。したとしても、絶対に渡した関数は即時実行(=同期実行)されません。このコールバックをとって関数を非同期実行させるのは最もシンプルな方法ですが、見ての通りコードにしたときの書き順と、実行順が変化します。JSDeferredとは。JSDeferredが解決することJSDeferredはJavaScript上の、あらゆる非同期処理を扱うライブラリです。Deferredというのは聞き慣れない言葉ですが、これはJSDeferredがMochiKitのDeferredを参考に作られているからです。いくため、と僕は覚えています。詳しいことはあとあと説明しますが、JSDeferredというライブラリは以下の事柄をコンセプトにしています。コンパクトであること単純にコード行数が少ないということです。スタンドアローンで動くこと他のどんなライブラリやフレームワークにも依存せずに動くということです。挙動のみに依存しています。書きやすいことコールバックによる非同期処理がめんどうくさくて作ったものなので書きやすくないと意味がありません。JSDeferred自体のコードを読みとくときや、これからの解説を読むうえでこれらが頭に入っていると、理解が早いかと思います。これらは全てコールバックをとり、それをあとで実行していくものです。以下のようなコードを考えてみます。全ての情報を得たい、という場合です。実行する関数として考えてください。});});このようにだんだんと関数のネストが深くなっていきます。この程度ならまだいいですが、これがさらに数個あったりしたらどうでしょうか。以下のように任意の個数のデータを取得しなくてはならないときはどうでしょうか。"/baz.json"];正直めんどうくさくありませんか?このように、単純にコールバックを使って非同期の処理をしていく方法だと、複雑な処理を書くのがとても難しくなります。JSDeferredを使うJSDeferredは、このようなコールバックの入れ子による非同期処理を、オブジェクトの連鎖による表現に変形させてあげることで、半分同期処理のような感覚で書くことができるようにします。全ての情報を得たい」というコードをJSDeferredで書きなおすと、以下のようになります。alert(results);});少々長くなりましたが、全く同じ形の部分が3回でてくるようになっています。同じ形ならば纏めてしまえば良いわけですから、さらに簡潔に以下のように書くことができます。alert(results);});この時点でかなり簡潔になりましたし、任意の数のリソースを読みこむ、というのも自然に達成できています。順番に読みこむものですが、実際には平行に読みこんで欲しい場合のほうが多いですね。そんなときにはさらに簡潔に、以下のように書けてしまいます。alert(results);});このように、コード上での非同期の処理の表現を変えつつ、いくつか便利な機能を提供しているのがJSDeferredです。ちなみにJSDeferredはjAutoPagerize[1]を作る過程で生まれたいくつかの欲求を解決するために作られました。そのときは、キャッシュを透過的に実装したい、というのが一番の目的でしたが、仕組みを作っているうちに一般化したくなったためにJSDeferredとして作りはじめました。[1]AutoPagerizeの別実装。JSDeferredは何を解決しないかJSDeferredはブラウザ間の挙動の差を吸収するためのライブラリではないJSDeferredは非同期処理の「書き方」を変えるだけクロスブラウザのためのライブラリではないJSDeferredは単機能なライブラリであって、例えばjQueryなどとは違って、イベントリスナをクロスブラウザ対応するためのものや、ほかにもエフェクトなども入っていません。役割が違うものなので、JSDeferredは、jQueryやTenなど、いわゆるJavaScriptのフレームワークと組み合せて使うことでアプリケーションを作ることになると思います。「書き方」を変えるだけJSDeferredは基本的には「書き方」を変えるためのライブラリです。「⁠書き方」が変わる仕組みをいくつか導入して、より非同期処理を書きやすく、読みやすくしてくれます。コールバックを受け取る、JSDeferredを使わずに書いたときのような非同期処理の書きかたは、それぞれの非同期処理が依存関係を持っていたりすると、とたんにコールバックがネストされたりして読みにくく、書きにくくなります。これを解決して、複雑なものをできるだけ複雑にさせないためのライブラリです。今回はJavaScriptにおける非同期処理の確認と、JSDeferredが何をするかを解説しました。次回からは実際に簡単なJavaScriptのアプリケーションを作りながら、JSDeferredの使いかたを解説をしていきます。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します⁠。個別にライセンスが設定されている記事等はそのライセンスに従います。