Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当我尝试访问其任何属性时,AJAX响应为空_Javascript_Json_Ajax - Fatal编程技术网

Javascript 当我尝试访问其任何属性时,AJAX响应为空

Javascript 当我尝试访问其任何属性时,AJAX响应为空,javascript,json,ajax,Javascript,Json,Ajax,我试图通过AJAX为Greasemonkey脚本引入一些JSON数据 以下是我所拥有的: var xmlhttp=new XMLHttpRequest(); xmlhttp.onreadystatechange=函数(){ if(this.readyState==4&&this.status==200){ var xmlresult=JSON.parse(this.response); //这很有效 console.log(xmlresult); } }; open(“GET”https://

我试图通过AJAX为Greasemonkey脚本引入一些JSON数据

以下是我所拥有的:

var xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=函数(){
if(this.readyState==4&&this.status==200){
var xmlresult=JSON.parse(this.response);
//这很有效
console.log(xmlresult);
}
};
open(“GET”https://raw.githubusercontent.com/mledoze/countries/master/countries.json“,对);
xmlhttp.send();
//这不管用

console.log(xmlresult)
这是因为
xmlresult
onreadystatechange
侦听器函数中的局部变量,其值不会保留供外部使用。你应该做:

var xmlresult;
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
  if (this.readyState == 4 && this.status == 200) {
    xmlresult = JSON.parse(this.response);
  }
};
xmlhttp.open("GET", "https://raw.githubusercontent.com/mledoze/countries/master/countries.json", true);
xmlhttp.send();

[…],但是如果我尝试在if块[…]之外使用它执行任何操作
if
块之外,您会尝试访问它吗?如果它在回调之外,则不会填充它,因为请求是异步的。显示一个完整的最小示例演示了当您尝试访问它时,它在何处是空的。正如您所看到的,我在代码段中添加了一个console.log,它可以工作(显示json)。我尝试在
xmlhttp.send()
之后访问该代码块之外的结果,但运气不佳。这不是AJAX问题。这个问题缺乏对作用域的基本理解。是的,它需要是全局的,或者至少在侦听器函数的作用域之外,这取决于需要它的值的位置。不管它是全局的,当方法是异步的时候?这是异步的,最好的办法是传递一个回调,一旦收到响应数据就会触发。或者,如果方法是异步的,那么查看promisesIt就很重要,因为
xmlresult
变量只有在异步函数完成后的某个时间才会获得值。通常,您可以通过在异步函数体中进行函数调用来隔离这一时刻。您缺少了一些东西。在最初的文章中,变量是在函数范围内用
var
关键字定义的,因此它在函数范围外根本不可见。但我在回答中改变了这一点,以表明正确的做法。