如何在函数外部访问变量?

时间:2013-12-31 23:35:33

标签: javascript jquery

我使用$.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

的ID

这是我目前的剧本:

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搜索时,它说要在函数外部声明变量,我在代码中看到了它,但是它仍然不起作用。

2 个答案:

答案 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);
});

<小时/> 清理你的代码!

  • 将第二个请求放入函数
  • 并让它接受sID作为参数,因此您不必再全局声明它! (全局变量几乎总是邪恶的!)
  • 删除sID和obj变量 - 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);
        });
    });
});

这对未来的修改会更加开放,并将第一次通话的责任分开来了解第二次通话。

第一个调用可以简单地完成,并且不必了解您可能想要添加的任何其他逻辑,并且将逻辑的耦合分开。