我使用$.getJSON
从json文件中获取数据以获取字符的ID,然后使用$.getJSON
使用我之前使用的ID从其他页面获取数据。
然而,在控制台中它说
https://prod.api.pvp.net/api/lol/eune/v1.2/stats/by-summoner/undefined/summary?api_key=API_KEY_HERE
它应显示unidentified
- /by-summoner/undefined/summary
这是我目前的剧本:
var input = "netuetamundis";
var sID;
$(document).ready(function () {
// get json from this page to get the ID of the input
$.getJSON("https://prod.api.pvp.net/api/lol/eune/v1.1/summoner/by-name/" + input + "?api_key=API_KEY_HERE", function (name) {
obj = name;
sID = obj.id;
console.log(sID);
});
$.getJSON("https://prod.api.pvp.net/api/lol/eune/v1.2/stats/by-summoner/" + sID + "/summary?api_key=API_KEY_HERE", function (stats) {
console.log(stats);
});
});
当我用Google搜索时,它说要在函数外部声明变量,我在代码中看到了它,但是它仍然不起作用。
答案 0 :(得分:7)
您的变量声明及其范围是正确的。您面临的问题是第一个AJAX请求可能需要一点时间才能完成。因此,在设置其内容之前,第二个URL将填充sID
的值。您必须记住,AJAX请求通常是异步的,即在后台获取数据时代码执行会继续。
您必须嵌套请求:
$.getJSON("https://prod.api.pvp.net/api/lol/eune/v1.1/summoner/by-name/"+input+"?api_key=API_KEY_HERE" , function(name){
obj = name;
// sID is only now available!
sID = obj.id;
console.log(sID);
});
<小时/> 清理你的代码!
name.id
就足够了,除非你真的需要函数外的其他变量。
$.getJSON("https://prod.api.pvp.net/api/lol/eune/v1.1/summoner/by-name/"+input+"?api_key=API_KEY_HERE" , function(name){
// We don't need sID or obj here - name.id is sufficient
console.log(name.id);
doSecondRequest(name.id);
});
/// TODO Choose a better name
function doSecondRequest(sID) {
$.getJSON("https://prod.api.pvp.net/api/lol/eune/v1.2/stats/by-summoner/" + sID + "/summary?api_key=API_KEY_HERE", function(stats){
console.log(stats);
});
}
Hapy新年:)
答案 1 :(得分:1)
$.getJSON
是一个异步请求,这意味着即使请求尚未完成,代码也会继续运行。你应该在第一个请求完成后触发第二个请求,这是ComFreek answer中已经看到的一个选择。
或者你可以使用jQuery的$.when / .then(),类似于:
var input = "netuetamundis";
var sID;
$(document).ready(function () {
$.when($.getJSON("https://prod.api.pvp.net/api/lol/eune/v1.1/summoner/by-name/" + input + "?api_key=API_KEY_HERE", function () {
obj = name;
sID = obj.id;
console.log(sID);
})).then(function () {
$.getJSON("https://prod.api.pvp.net/api/lol/eune/v1.2/stats/by-summoner/" + sID + "/summary?api_key=API_KEY_HERE", function (stats) {
console.log(stats);
});
});
});
这对未来的修改会更加开放,并将第一次通话的责任分开来了解第二次通话。
第一个调用可以简单地完成,并且不必了解您可能想要添加的任何其他逻辑,并且将逻辑的耦合分开。