如何将数据存储在全局变量中?

时间:2017-06-07 14:16:54

标签: javascript jquery json

$(function(){

    var astronautsData;

    $.getJSON('http://api.open-notify.org/astros.json', doSomething);

    function doSomething(data) {
        astronautsData = data;
    }

    alert(astronautsData.people[0].name)

});

我希望能够在我制作的每个函数中使用数据,这就是为什么我试图将它放在变量astronautsData中,但遗憾的是astronautsdata未定义。

6 个答案:

答案 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为全局

,请使用它