カリー化関数を利用して非同期処理を整理する
カリー化関数を使うと、複雑になりがちな非同期処理のコールバックを比較的シンプルに記述できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//非同期処理 var GetJSON = function(fn) { $.ajax({ url:'json.php', dataType:'json', success:function(json){ fn(json); } }); } //束縛 var getJson = curry(GetJSON ,function(d){ console.log(d) }); //実行 getJson(); |
サンプル1
サンプル2
Google Map Apiを使っての地図作成では、
- geocodeで緯度経度取得→地図移動→XHR→地図上にマーカー表示
- 位置情報取得→地図移動→XHR→地図上にマーカー表示
上記の処理をよく行いますが、「geocode」「位置情報取得」「XHRでのデータの取得」などは基本”非同期”の処理のためコールバックが入れ子になって複雑になりがちです。
そんなときは、curryを使って非同期処理のコールバックをまとめるとシンプルに整理できたりします。
実際にsampleを作ってみました。
位置情報を取得して周辺500m内の車椅子可のお店を表示する地図です。(位置情報が使えない場合は住所で検索してください)
↓ curryを使うことで非同期処理をこんな感じに書けます。詳しい内容はリンク先のソースを参照してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//json取得時のコールバックを束縛 var getJson = curry(GetJSON ,function(d){ Markers.setMember(getLatLong(d), getContent(d)); //マーカーをセット }) ; //geocode 検索時のコールバックを束縛 var searchAddress = curry(SearchAddress, function(d){ panTo(d); //地図移動 Markers.deleteAllMarkers(); //マーカーを全削除 getJson([d.lat(), d.lng()]) ; //json取得 }); //位置情報取得時のコールバックを束縛 var getCurrentPosition = curry(GetCurrentPosition, function(d){ panTo(d); //地図移動 Markers.deleteAllMarkers(); //マーカーを全削除 getJson([d.lat(), d.lng()]) ; //json取得 }); //住所検索ボタン、イベント設定 $('#search').click(function(){ searchAddress(document.getElementById('address').value); //geocodeで検索 }); //現在位置取得ボタン、イベント設定 $('#getCurrentPosition').click(function(){ getCurrentPosition(); //位置情報取得 }); |