var links = [];
function getFeed() {
$.getJSON("http://www.reddit.com/.json?jsonp=?", function (data) {
$.each(data.data.children, function (i, item) {
var url = item.data.url;
links.push(url);
});
alert("Inside request: " + links.length);
});
}
getFeed();
alert("Outside request: " + links.length);
结果:
Outside request: 0
Inside request: 25
由于请求似乎是异步的,如何修改我的代码以同步使用请求中的数据?
如果我在这里遗漏了一些明显的东西,我道歉...答案 0 :(得分:1)
getJSON
是一个异步函数。访问数据的唯一可靠方法是在函数范围内。无论你需要用links
做什么都可以在函数内完成,对吗?
答案 1 :(得分:1)
向getFeed()添加回调。
var links = [];
function getFeed(callback) {
$.getJSON("http://www.reddit.com/.json?jsonp=?", function (data) {
$.each(data.data.children, function (i, item) {
var url = item.data.url;
links.push(url);
});
alert("Inside request: " + links.length);
callback();
});
}
getFeed(function(){
alert("Outside request: " + links.length);
);
答案 2 :(得分:1)
由于AJAX是异步的,因此上述代码中的alert
将在getFeed
执行完毕后立即被触发。
问题是,getFeed不会等待$ .getJSON返回响应以完成执行,它会设置AJAX请求,将其发送出去,并立即完成执行,此时服务器的可能性极小已响应$ .getJSON请求。
这就是我们在异步编程中使用回调(查看$ .getJSON调用中的函数声明)的原因 - 我们无法100%确定响应何时完成,但我们可以附加回调以便每当响应完成后,我们就可以执行必要的操作了。
简而言之,您需要将依赖于您的响应的内容放在回调中,或者取决于您的回调触发。
答案 3 :(得分:1)
由于这是一个JSONP请求,你无法真正做到这一点。通过创建<script>
标记来执行JSONP请求,这些标记以JSON作为参数执行全局回调函数。它们不是常规的AJAX请求,但jQuery使它们看起来像那样。
使用回调会更容易:
function getFeed() {
return $.getJSON("http://www.reddit.com/.json?jsonp=?").pipe(function(data) {
return $.map(data.data.children, function(item) {
return item.data.url;
});
});
}
getFeed().done(function(links) {
console.log(links)
});