読み込まれた JSON オブジェクトを変数に格納したいと考えています。通常、私は次のようなことをする必要があります:
d3.json("jsondatafile.json", function(json){ DO SOMETHING; });
しかし、代わりに、次のようなものが欲しいです:
var jsonData = d3.json("jsondatafile.json");
関数jsonData
外にアクセスしたい。d3.json
これどうやってするの?
jQuery.ajax()はいつでも同期的に使用できます。
var jsonData;
$.ajax({
dataType: "json",
url: "jsondatafile.json",
async: false
success: function(data){jsonData = data}
});
ただし、jQuery API で説明されているように、推奨されません。
Ajax の最初の文字は「非同期」を表し、操作が並行して行われ、完了する順序が保証されないことを意味します。$.ajax() の async オプションのデフォルトは true で、リクエストが行われた後もコードの実行を続行できることを示します。このオプションを false に設定する (したがって呼び出しが非同期でなくなる) ことは、ブラウザーが応答しなくなる可能性があるため、強くお勧めしません。
関数d3.json()
は非同期です。data
したがって、変数を読み取る前に、データが受信されるのを待つ必要があります。d3.json()
これが、非同期データを扱うときに、関数 内ですべてを行うことが慣行である理由です。
d3.json("temp.json", function(data){
//use data here
})
// do not use data anymore
注:ここでの私の以前の回答からインスピレーションを得た回答: How to import json data in D3?
Scott Murray による Web 用の Interactive Data Vis (p 74) によると、最初にグローバル変数を宣言できます。コールバック関数内で、データをグローバル変数に割り当てます。
var dataset; // global
d3.json("file.json", function(data) {
dataset = data;
//any other functions that depend on data
});
データセットは、後続のすべての関数で利用できます