我正在尝试使用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>
答案 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;这里。基本上:
sample
success
回调,并继续以愉快的方式进入下一个语句。虽然这看起来很糟糕,但它实际上很棒!因为单线程JavaScript环境可以调度多个操作而不必担心阻塞执行。alert
触发器的当前值sample
undefined
success
回调,它会使用返回的数据调用它sample
(因为您在父作用域中定义了它在回调范围内可用)现在已赋值为data
如果您想更多地了解幕后发生的事情,我建议您excellent SO answer。