-1

JSONを解析しようとしています。私は使っている

$getJSON

ファイルを取得し、その内容を変数に保存するには

JSONfile

、これを解析関数に渡しますが、getJSON関数の外側にはnullが含まれており、その内側には適切なデータが含まれているとはいえ、変数

JSONfile

グローバルに宣言されています(そうだと思います)。私はJavascriptの初心者です。ここで何が起こっているのかを説明するか、似たようなことを教えてください (自分自身を見つけることができませんでした)。

var atlasJSON = "http://127.0.0.1:8000/sprites/SPRITE.json";
var JSONfile = null;

function setup(){

    body = document.getElementById('body');
    canvas = document.createElement('canvas');

    spriteManager = new SpriteSheetClass();
    spriteManager.load(spritesheet);


    $.getJSON(atlasJSON, function(data) {
        JSONfile = data;
        console.log(JSONfile); // JSON file content is here
    });

    console.log(JSONfile); // null !!!
    debugger;

    spriteManager.parseAtlasDefinition(JSONfile);

    for(var i=0; i<spriteManager.sprites.length ; i++){
        console.log(spriteManager.sprites[i]);    
    }

    //canvas = document.getElementById('canvas');
    ctx = canvas.getContext('2d');

    canvas.setAttribute('width', 1024);
    canvas.setAttribute('height',800);

    body.appendChild(canvas);
};
4

3 に答える 3

2

コールバック内でjsonを使用する必要があります

$.getJSON(atlasJSON, function(data) {
        JSONfile = data;
        console.log(JSONfile); // JSON file content is here

    console.log(JSONfile); // null !!!
    debugger;

    spriteManager.parseAtlasDefinition(JSONfile);

    for(var i=0; i<spriteManager.sprites.length ; i++){
        console.log(spriteManager.sprites[i]);    
    }

    //canvas = document.getElementById('canvas');
    ctx = canvas.getContext('2d');

    canvas.setAttribute('width', 1024);
    canvas.setAttribute('height',800);

    body.appendChild(canvas);
});
于 2013-05-21T20:05:37.810 に答える
2

$.getJSON は非同期です。これは、次を呼び出す場合を意味します。

$.getJSON(atlasJSON, function(data) {
        JSONfile = data;
        console.log(JSONfile); // JSON file content is here
    });

それから

console.log(JSONfile); // JSONfile is null...

これは予期される動作です。JSON は、関数 (データ) が呼び出されたときにのみ使用できます。

関数 getJSON はコードの実行をブロックしません。ネットワーク経由でサーバーにリクエストを送信し、返されるデータを待ちます。リモートサーバーからのデータが受信されるまで、コードは次のコード行(この場合はconsole.log)で実行され続けます。そのようなデータが完全に受信されると、関数が呼び出されます。

関数が返されたら、関数でできることは、JSON をグローバル変数に割り当てて、コード内のどこからでもアクセスできるようにすることです。

var JSONData = null;

関数(データ)が呼び出されたら、それを変数に割り当てます。このようにして (関数 (データ) が呼び出されるのは一度だけ)、すべての JavaScript コードで使用できます。

于 2013-05-21T20:06:21.563 に答える