JSDeferredがやっとわかった
JSDeferred による非同期処理のスライドを見て、「JSDeferred っておもしろそー」って思ってたんだけど、1ヶ月放置した挙句にやっと読み始めた。
JSDeferred の解説記事って検索しても出てこないので、ソース読まずにはちゃんとした使い方がわからない。
それどころか、ソース読んでも一見何やってるのかわからない。(おまけにコメント部分の英語がちょっとアレなのでというのもあるけど…)
というわけで腰を落ち着けて読みながら理解した点をメモってたら、こんな分量になってしまった。
- JSDeferredのソース読んでる - JavaScriptで遊ぶよ - g:javascript
- JSDeferredのソース読んでる・その2 - JavaScriptで遊ぶよ - g:javascript
- JSDeferredのソース読んでる・その3 - JavaScriptで遊ぶよ - g:javascript
- JSDeferredのソース読んでる・その4 - JavaScriptで遊ぶよ - g:javascript
- JSDeferredのソース読んでる・その5 - JavaScriptで遊ぶよ - g:javascript
JavaScript の処理スタックというのは、
あるイベントが起こる。
↓
イベントに付随した処理を順番に実行する。
の繰り返しになっていると思う (スクリプトのパースも1つのイベントと考えるなら)。あるイベントの処理を実行中なら、別の処理やレンダリングは割り込むことができない。それらは次のイベントとしてスタックに格納される。
JSDeferred はそれをうまく利用して、まず処理の流れをチェーンにしてしまう。
- チェーンの構成要素 (以下は「要素」とだけ書く) の一つ一つは Deferred クラスのインスタンスである。
- 個々の要素は、自分が実行すべき処理と、自分の次にあたる要素だけを知っている。
- このチェーン構築が一つのイベントで起こる。
- そのイベントはそれで終了させて、チェーンの最初の要素を setTimeout (など) でキックしている。
- ある要素をキックすると、そいつに付随した処理が実行され、そいつが次の要素をキックする。
- もしある要素に付随した処理が別の Deferred インスタンスを返したときは、そいつが次の要素となってチェーンの中に割り込むことができる (チェーンの実行中に!)。
- このときだけは、割り込んだ要素や次の要素は自動的にはキックされない。
- これでそのイベントは流れる。
- 別イベントとなる setTimeout や addEventListener などで明示的にその割り込んだ要素をキックしてやると、それ以降の処理が繋がるというわけ。
チェーンの動的書き換えが JSDeferred の中心だった。
勉強になった。
とりあえず JSDeferred で何がしたいかといえば、汎用インクリメンタルサーチクラスを作りたい。今から遊んでみる。