$(function(){
var astronautsData;
$.getJSON('http://api.open-notify.org/astros.json', doSomething);
function doSomething(data) {
astronautsData = data;
}
alert(astronautsData.people[0].name)
});
我希望能够在我制作的每个函数中使用数据,这就是为什么我试图将它放在变量astronautsData中,但遗憾的是astronautsdata未定义。
答案 0 :(得分:1)
你可以在doSomething.your alert()中访问astronautsData来执行 在getJSON之前。这就是你未定义的原因。
$(function(){
var astronautsData;
$.getJSON('http://api.open-notify.org/astros.json', doSomething);
function doSomething(data) {
astronautsData = data;
alert(astronautsData.people[0].name)
}
});
答案 1 :(得分:0)
您的.getJSON
是异步的。
尝试使用Promise等待您的通话完成:
prom = new Promise((resolve, reject) => {
$.getJSON('http://api.open-notify.org/astros.json', function(){
astronautsData = data;
resolve('Ajax done');
});
});
prom.then((successMessage) => {
console.log(successMessage);
alert(astronautsData.people[0].name)
});
答案 2 :(得分:0)
在我看来,在窗口/全局范围内公开变量是不好的。你应该把它包装在一个函数中(比如一类),然后将它暴露出来:
function Values(type) {
this.value1 = "something";
}
从这一点开始,您可以使用原型在“值”上定义其他函数,如下所示:
Values.prototype.doStuff = function() {
return this.value1 + ' addsomething';
};
在原型函数内部,您可以定义/返回promise或执行任何操作,包括为实例分配值。您还可以将实例分配给全局变量,以使其成为单个排序。假设你仍然使用全局变量,但它的变量值实例分配给变量而不是存储的实际值。
这或许有点过度简化,但在某种程度上这就是lodash或jquery的全局变量如何工作,尽管他们在尝试定义它之前还有很多要检查现有的全局变量等等。在全球范围内,通常你想避免这种情况。
答案 3 :(得分:0)
您可以在全局范围内使用var(在所有函数之外)来声明全局变量:
<script>
var astronautsData;
$(function(){
$.getJSON('http://api.open-notify.org/astros.json', doSomething);
function doSomething(data) {
astronautsData = data;
}
alert(astronautsData.people[0].name)
});
</script>
答案 4 :(得分:0)
在这里你必须理解getJSON是'异步'的一件事。您的警报方法试图显示将来会出现的数据。为了解决这个问题,你必须使用“then”,“done”或“fail”,如下所示。
$(function(){
var astronautsData;
//Assign your getjson request
var jsonRequest = $.getJSON('http://api.open-notify.org/astros.json');
//This function runs once the getJSON method is success
jsonRequest.done(function(data){
astronautsData = data;
});
//This function runs after the success of getJSON
jsonRequest.then(function(){
//Here you have to do your alert ( This alert will give data )
alert(astronautsData);
});
//This alert will give undefined value as this line of code and getjson request runs parallelly
alert(astronautsData);
});
答案 5 :(得分:-1)
如果您希望global.astronautsData为全局
,请使用它