JSON数据显示未定义

时间:2017-08-19 13:26:55

标签: jquery json ajax

我正在尝试使用Reddit API显示数据。当我在警报时显示它时,结果是未定义的。

<!DOCTYPE html>
<html>
<body>

<h2>Create Object from JSON String</h2>

<p id="demo"></p>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.js" type="text/javascript"></script>
<script>
    var sample;
    $.ajax({ url: 'http://reddit.com/r/forhire.json', success:
        function(data) {
        sample = data;
    }
    });
    alert(sample);


</script>

</body>
</html>

1 个答案:

答案 0 :(得分:1)

由于您的ajax请求是异步的,因此sample 在您将其传递给alert时未定义alert需要在成功回调中。

var sample;

$.ajax({ url: 'https://www.reddit.com/r/forhire.json', success:
    function(data) {
    sample = data;
    console.log(sample)
  }
});

如果您来自同步背景,则很难理解JavaScript的异步特性。我建议您阅读an introduction to asynchronous JavaScript或其他指南,以便更好地了解这一点。但是,我会尽力解释&#34; flow&#34;这里。基本上:

  1. 您声明sample
  2. 您发起一个Ajax请求(使用XMLHTttpRequest),默认情况下是异步的。浏览器在后台开始此请求,注意提供给它的success回调,并继续以愉快的方式进入下一个语句。虽然这看起来很糟糕,但它实际上很棒!因为单线程JavaScript环境可以调度多个操作而不必担心阻塞执行。
  3. 您的alert触发器的当前值sample undefined
  4. ajax请求(已在&#34;后台&#34;中继续)完成,因为您提供了success回调,它会使用返回的数据调用它
  5. sample(因为您在父作用域中定义了它在回调范围内可用)现在已赋值为data
  6. 如果您想更多地了解幕后发生的事情,我建议您excellent SO answer