問題getJSON
は非同期であるようです。実行して終了し、コードが続行されると、データを取得するためのネットワーク操作の開始のみが示されます。実際のネットワーク操作は、しばらくしてから完了します。
完了すると、成功ハンドラーが呼び出され (呼び出しの 2 番目の引数として指定)、配列getJSON()
にデータを入力します。timeStamp
その成功ハンドラーが呼び出された後にのみ、timeStamp
配列は有効になります。
timeStamp
そのため、呼び出しの直後のコードで配列を使用することはできませんgetJSON()
(まだ入力されていません)。他のコードでtimeStamp
配列が必要な場合は、成功ハンドラーからそのコードを呼び出すか、他のタイミング メカニズムを使用してtimeStamp
、成功ハンドラーが呼び出されてtimeStamp
配列が呼び出されるまで、配列を使用するコードが配列を使用しようとしないことを確認する必要があります。が入力されています。
一部の Ajax 呼び出しを非同期ではなく同期にすることもできますが、これは一般的に非常に悪い考えです。これは、ネットワーク操作全体でブラウザーがロックされ、ビューアーにとって非常に不親切になるためです。非同期ネットワークで動作するようにコーディング ロジックを修正することをお勧めします。
このような ajax 呼び出しの典型的な設計パターンは次のとおりです。
function loadData (url){
$.getJSON(url, function(json) {
// this will execute AFTER the ajax networking finishes
var timeStamp = [];
for (var i=0;i<json.length;i++) {
timeStamp.push(json[i].TimeStamp);
}
console.log(timeStamp);
// now call other functions that need timeStamp data
myOtherFunc(timeStamp);
});
// this will execute when the ajax networking has just been started
//
// timeStamp data is NOT valid here because
// the ajax call has not yet completed
// You can only use the ajax data inside the success handler function
// or in any functions that you call from there
}