0

json を読み取り、簡単な処理を行い、結果として配列を返す単純な関数を作成したいと考えています。

私は現在、以下のコードを持っています。ただし、関数は常に [] を返します。

temps をグローバル スコープに移動すると、最初に [] が返され、2 回目に呼び出されたときにデータが追加され、3 回目に呼び出されたときに長さが 2 倍になります。

function getTempData() {
    var temps = [];
    $.getJSON('temp.json', function(data) {
    data = data.observations.data;

    for(var i = 0; i < data.length; i++) {
        year    = parseInt(data[i].aifstime_utc.substr(0, 4));
        month   = parseInt(data[i].aifstime_utc.substr(4, 2));
        day     = parseInt(data[i].aifstime_utc.substr(6, 2));
        hour    = parseInt(data[i].aifstime_utc.substr(8, 2));
        min     = parseInt(data[i].aifstime_utc.substr(10, 4));
        time = Date.UTC(year, month, day, hour, min);

        temps.push([time, data[i].air_temp]);
    }
});
return temps;
}

他のいくつかの質問を見ると、これは非同期性と関係があるようです? 同期的にロードする方法はありますか?ハイチャートでデータをグラフ化したいと思います。

4

1 に答える 1

1

データを処理する関数が呼び出される前に、関数が返す ajax 呼び出しの非同期の性質のため、dakait はほとんどそこにありました。次の例を検討してください。

function test(){
  var done=false;
  setTimeout(function(){
    done=true;
  },500);
  return done;
};
alert(test());//will say false

コードでは、3 つの関数が必要です。1) getTempData を呼び出します。2) サーバーからデータを取得します。3) データを処理します。

function getTempData() {
    var temps = [];
// 2) fetch the data
    $.getJSON('temp.json', 
    function(data) {
// 3) process the data
    data = data.observations.data;

    for(var i = 0; i < data.length; i++) {
        year    = parseInt(data[i].aifstime_utc.substr(0, 4));
        month   = parseInt(data[i].aifstime_utc.substr(4, 2));
        day     = parseInt(data[i].aifstime_utc.substr(6, 2));
        hour    = parseInt(data[i].aifstime_utc.substr(8, 2));
        min     = parseInt(data[i].aifstime_utc.substr(10, 4));
        time = Date.UTC(year, month, day, hour, min);

        temps.push([time, data[i].air_temp]);
    }
    processTempData(temps);
});
//return temps;//this line executed immediately after $.getJSON is called
// but before function 2) has been called
}

1)
function callgetTempData(){
//...
  getTempData();
  // no use processing anything here since the ajax call is not finished yet
  // asynchronous means that js will not wait until it's done.
  // I would not advice using synchronous
}
2) // further process data
function processTempData(theData){
// do something with the data here
}

プロセスの一部である多数の ajax 呼び出しを含むアプリケーションでは、メディエーター パターンの使用を検討できます。

異なるプロセスで使用される複数の xmlhttprequests に使用するのに適したパターン

于 2013-03-11T06:38:15.063 に答える