2

私は主に独学のプログラマーであり、最近、これまで使用したことのない JSON を使用する League of Legends API をいじっています。

これは、プレーヤーの ID を取得するコードの一部です。

function RiotAPI(phrase) {
...
this.request = function() {
    return $.ajax({
        url: url,
        type: 'GET',
        dataType: 'json',
        data: {

        },
    });
}
}

function getID(key, name) {
phrase = getPhrase(2, key, 0, name);
api = new RiotAPI(phrase);
api.request().done(function(data)
    {
        window.console&&console.log(data[name]['id']);
        document.getElementById("sID").innerHTML = data[name]['id'];
    });
}

この場合、コンソールは data[name]['id'] にデータを適切に記録します。ただし、次のようなことをすると

id = data[name]['id']

変数「id」は未定義です。これはjsonの性質によるものだと理解していますが、一般的な対処方法は何ですか?

今、私は持っています

document.getElementById("sID").innerHTML = data[name]['id'];

これは驚くほど機能し、非常に悲しい変数のように機能します。明らかに、これを処理するためのより良い方法が必要ですよね?

ありがとう

4

2 に答える 2

1

この場合、コンソールは適切にログを記録します... data[name]['id']. しかし... id = data[name]['id']...その場合、変数「id」は未定義です。

いいえ、 がconsole.log機能する場合、そのコードは同じ値を に正常に割り当てますid

これはjsonの性質によるものだと理解しています

いいえ、JSON とは関係ありません。1 つには、そのdata変数を扱っているときには、JSON を扱っていないということです。これは単なる JavaScript オブジェクトです。JSON はテキスト表記です。JavaScript コードを書いていて、文字列を扱っていない場合は、JSON を扱っていません (解析済みです)。

関数の名前と引数だけに基づいて、から値を返そgetIDうとしていると思います。できません。Ajax は非同期です。つまり、返されたとき、ajax 呼び出しはまだ終了していませんidgetIDgetID

getIDデータが利用可能になったときに呼び出すコールバックを渡すか、promise などを返す必要があります。詳細については、この質問とその回答を参照してください。

getIDコールバックの使用例を次に示します。

function getID(key, name, callback) {
    var phrase = getPhrase(2, key, 0, name);
    var api = new RiotAPI(phrase);
    var api.request().done(function(data)
    {
        var id = data[name]['id'];
        window.console&&console.log(id);
        document.getElementById("sID").innerHTML = id;
        callback(id);
    });
}

使用法:

getID("the key", "the name", function(id) {
    // Use `id` here
});

コメントでid、グローバル変数に入れたいと言っていました。その場合、次のようにします。

var id;

getID("the key", "the name", function(receivedId) {
    id = receivedId;
});

...しかし、呼び出した後、ajax リクエストが完了する前にidなることに注意してください。undefinedgetID

補足: あなたのコードはThe Horror of Implicit Globals の餌食になっているようです。phraseapiinなどの変数を確実に宣言する必要がありますgetID

于 2015-09-24T21:39:00.590 に答える
0

変数「id」を宣言している場所が、それを使用している場所と同じスコープにあることを確認する必要があります。

function RiotAPI(phrase) {
var id;
...
this.request = function() {
    return $.ajax({
        url: url,
        type: 'GET',
        dataType: 'json',
        data: {

        },
    });
}
}

function getID(key, name) {
phrase = getPhrase(2, key, 0, name);
api = new RiotAPI(phrase);
api.request().done(function(data)
    {
        window.console&&console.log(data[name]['id']);
        id = data[name]['id'];
        document.getElementById("sID").innerHTML = data[name]['id'];
    });
}
console.log("id equals: " + id);

上記はうまくいくはずです。

于 2015-09-24T21:41:47.457 に答える