2

我主要是一个自学成才的程序员,最近我一直在搞乱英雄联盟 API,它使用了我以前没有使用过的 JSON。

这是我检索玩家 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 无关。一方面,当您处理该data变量时,您并没有处理 JSON。它只是一个 JavaScript 对象。JSON 是一种文本符号。如果您正在编写 JavaScript 代码,而不是处理字符串,那么您就不是在处理 JSON(它已被解析)。

纯粹基于getID函数的名称和参数,我猜你正试图idgetID. 你不能。Ajax 是异步的。这意味着当getID返回时,ajax 调用还没有完成

当数据可用时,您需要通过getID回调来调用,或者让它返回一个承诺等。更多在这个问题和它的答案中。

下面是一个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;
});

...但请注意,这idundefined在您调用getID之后和 ajax 请求完成之前。

旁注:您的代码似乎成为隐式全局恐怖的牺牲品。您需要确保声明变量,例如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 回答