如何正确,轻松地将数据分配给json中的变量?

时间:2015-09-24 21:31:44

标签: javascript json riot-games-api

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

这是我检索玩家ID的代码的一部分:

$('#FormSubmit').click( function() {
        var selectedDate = $("#priceLookupDay").val();
        $("form").attr('action', $("form").attr('action', "?sd="+ selectedDate ));
        $("form").submit();
    }); 

在这种情况下,控制台会正确地将数据记录在data [name] ['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'];
    });
}

然后变量'id'未定义。 我知道这是由于json的性质,但处理这个问题的常用方法是什么?

现在我有

id = data[name]['id']

令人惊讶地起作用,它的功能就像一个非常悲伤的变量。显然,必须有更好的方法来解决这个问题,对吗?

由于

2 个答案:

答案 0 :(得分:1)

  

在这种情况下,控制台会正确记录... data[name]['id']。但是...... id = data[name]['id'] ...然后变量' id'未定义。

不,如果console.log有效,该代码会成功将相同的值分配给id

  

我知道这是由于json的性质

不,它与JSON无关。首先,当您处理data变量时,您并未处理JSON。它只是一个JavaScript对象。 JSON是文本表示法。如果您正在编写JavaScript代码而不处理字符串,那么您就不会处理JSON(它已被解析)。

完全基于getID函数的名称和参数,我猜您是尝试从id 返回 getID值。你不能。 Ajax是异步。这意味着当getID返回时,ajax调用尚未完成

当数据可用时,您需要传递getID一个回调函数,或让它返回承诺等。this question and its answers更多信息。

以下是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;
});

...但请注意,在您致电id之后和ajax请求完成之前,undefined将为getID

旁注:你的代码似乎成了The Horror of Implicit Globals的牺牲品。您需要确保在phrase中声明您的变量,例如apigetID

答案 1 :(得分: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);

以上情况应该可以。