Google Chart を JSON から作成

ここでのポイントは Step1, Step2, Step3 を入れ子構造にして、$.ajax の内側に処理を記述してしまうこと。そうしないと $.ajax の処理が終わる前に、次の処理が走ってしまいます。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">

google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(drawChart);

var data, options, charts; 

function drawChart() {

  // Step1. data の取得
  $.ajax({ url: YOUR_JSON_DATA_URL, dataType:'json'}).done(function(tmp_data){
    data = google.visualization.arrayToDataTable(tmp_data);

    // Step2. options の取得
    $.ajax({ url: YOUR_JSON_OPTIONS_URL, dataType:'json'}).done(function(tmp_options){
      options = tmp_options;

      // Step3. グラフの作成
      chart = new google.visualization.ScatterChart(document.getElementById('chart_div'));
      chart.draw(data, options);
    });
  });
}
</script>
</head>
<body>
<div id="chart_div" style="width: 900px; height: 500px;"></div>
</body>
</html>

 

◯ 苦しんだところ

この $.ajax 関数が Javascript 初心者のワイには一番えげつない。最初に見た時に「ファ!」ってなった。理解はしてないけど、とりあえず処理を覚えたさ。

  • ajax の実行結果を無名関数の引数 tmp_data に代入: どうやってるの?泣
  • done 関数の引数に無名関数を設定: なんで引数に関数を指定するん?もっと他に方法なかったん?泣 関数を引数に指定するのは GoF ストラテジパターンでよく見かけたけど、こんな指定して即実行みたいな、引数の中に実行後の処理を記述するような使い方は、初めてですんなり入ってこなかった泣
  • done(function{})の記述の処理が完了する前に、それ以降の処理が開始泣 普通前の処理が終わる前に次の処理が開始しないやん。そんなの許したらプログラム成り立ちませんやん。これだけ例外ってことでええんかな。

 

◯ Handsontable とか使ってて思ったこと(関係ないけど)

データ本体を格納している配列をいじると、動的に表も更新された。Javascript こんなこともできるんか...。もう本当に自分の頭の中にあるプログラミングと全然ちゃうな...。表は、どうやって検知してるんやろ...?

◯ 参考サイト

jsonファイルから散布図を作成 deffered を使う方法。
deferred.resolve( ) dfr.resolve() 処理を完了する -> dfr.done() が呼ばれるみたいな。
Deferredを用いた書き方 Deferred の利点はネストが深くならないことかな
実行順番を保障する方法