2017-03-08 104 views
0
loadJSON(path, callback) { 
    console.log("path: " + path); 
    var xobj = new XMLHttpRequest(); 
     xobj.overrideMimeType("application/json"); 
    xobj.open('GET', path, true); 
    xobj.onreadystatechange = function() { 
      if (xobj.readyState == 4 && xobj.status == "200") { 
      callback(xobj.responseText); 
      } 
    }; 
    xobj.send(null); 
} 

上面是一个在本地访问json文件的函数。 然后从`foobar()'解析检索到的数据。 但是,从回调函数的“外部”,变量“json”无法访问。 我已经搜索了类似的SO问题和异步概念,但仍然无法找到解决问题的方法。访问javascript中一个回调函数的“外部”变量

function foobar() { 
    var json; 
    loadJSON("data.json", function(response) { 
     json = JSON.parse(response); 
     console.log(json[0].name); // Successfully shows the result 
    }); 
    console.log(json[0].name); // TypeError: json is undefined 
} 

有没有办法访问回调变量“外部”?

+0

http://stackoverflow.com/questions/14220321 /我怎么做 - 我从一个异步调用返回响应 –

+0

[为什么我的变量在函数内部修改后没有改变? - 异步代码引用](http://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside-of-a-function-asynchron) – Andreas

+0

检查两个链接现在我得到了一个更好的理解**为什么**它不能被称为'外部'的回调,现在我通过在'loadJSON()'中实现函数来解决我的问题,但是我仍然没有得到**可以访问它之外的变量。我想知道有一个解决方法不是为什么。 – HUKS

回答

2

这是因为它设置为异步模式。

console.log(json[0].name); // TypeError: json is undefined 

此代码在json填充之前执行。因此,当您尝试访问它时,它可能仍然是空的。在此行中的第三个参数将其定义为异步:

xobj.open('GET', path, true); 

你可以尝试把

xobj.open('GET', path, false); 

但它不再是不同步,用户将不得不等待请求结束,所以当回调方法已经被调用,而不是之前,确保使用'json'var可能会更好。保持异步模式。 为此,您需要重构您的代码。

Gerardo Furtado发布的链接完全准确,您应该检查它。

编辑:正如我已经指出,和其他用户也是如此,异步:假的不是很好,所以我编辑我的回答:

function foobar() { 
    var json; 
    loadJSON("data.json", function(response) { 
     json = JSON.parse(response); 
     // Call another function with json that is now filled with data 
     triggered(json); 
    }); 
} 

function triggered(json) { 
    console.log(json[0].name); 
    // Do your work on json 
} 
+0

接受为答案,因为它实际上解决了我的问题。 – HUKS

+0

@HUKS'async:false'几乎总是**不是**答案......您应该仔细看看“Possible duplicate:...”链接,以了解问题的核心以及如何解决 – Andreas

+0

我接受这个答案的原因是,我的目标是一个脱机运行的脚本,使用浏览器就像用户界面一样,所以我想我不必担心服务器响应问题。我同意这可能不是大多数异步情况下的答案。 – HUKS

1

这很简单。在函数之外声明json变量。这给变量一个全局范围。调用该函数只是为了覆盖json,而json可以在脚本中的任何地方使用

相关问题