2013-04-17(水) [長年日記]
■ jQueryのDeffered/Promiseを会得した(いまごろ)
なんか最近、やたらと非同期処理の文脈で「promise」というキーワードを見ることが増えて、なんか流行ってんのかなーくらいにしか思ってなかったんだけど、実はjQuery.ajaxを使っているときに恩恵を受けていたことを(いくつか実装してみて)ようやく理解したのであった。Deffered/Promiseが実装されたのは、もう2.0もなろうというjQueryが1.5のころの話である。鈍すぎる……。
というのも、あんまり理解せずにコピペしていたからなんだよな。かつてはこんな感じに書いていたjQuery.ajaxの呼び出しが:
jQuery.ajax({ type: 'POST', url: '/', ..., success: function(){...}, error: function(){...} });
何かのソースを読んでいたらこんな風に書けることを知って:
jQuery.ajax({ type: 'POST', url: '/', ...}) .done(function(){...}) .fail(function(){...});
「へー、最近はメソッドチェインで書くんだ」とか思ってそのまま真似していたんだよ。しかも「なんでsuccessやerrorから名前を変えたんだ」とか見当違いの不満をぶつけつつ。ここでちゃんと意味を理解していれば、コールバックの密林に分け入って無駄に複雑なパズルを解くはめにならずに済んだのに!
で、↓のあたりを読んで、ようやくjQuery.ajaxがPromiseを返しているということを理解したのだった。
そうとわかれば、jQuery.ajax(またはそこからつながったdoneやfail)の返り値を利用して、他の処理を同期的に書くことができる。おかげでいろいろ諦めていた制約がすっきり解決できた(主にmassrで)。
まったくなー。コピペだめ! ぜったい!