我主要是一个自学成才的程序员,最近我一直在搞乱使用我以前没有用过的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']
令人惊讶地起作用,它的功能就像一个非常悲伤的变量。显然,必须有更好的方法来解决这个问题,对吗?
由于
答案 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
中声明您的变量,例如api
和getID
。
答案 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);
以上情况应该可以。