2013-07-15 23 views
1
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); 

结果:访问jQuery/AJAX请求中的变量/数据?

Outside request: 0 
Inside request: 25 

由于请求似乎是异步的,我怎么能修改我的代码从同步请求使用数据?

我道歉,如果我失去了一些东西很明显这里...

+1

只是包装你需要的AJAX回调的内部执行代码。 – Saturnix

回答

1

getJSON是一个异步函数。访问数据的唯一可靠方法是在函数范围内。无论你需要做什么links都可以在里面完成功能,对吗?

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); 

); 
1

因为AJAX是异步在上面的代码alert会后getFeed执行完毕即可立即解雇。

问题是,getFeed不会等待$ .getJSON返回一个响应来完成执行,它会设置AJAX请求并将其发送出去,并立即执行完毕,而到那时候,服务器已响应$ .getJSON请求。

这就是为什么我们在异步编程中使用回调函数(查看$ .getJSON调用中的函数声明) - 我们无法100%确定响应何时完成,但我们可以附加一个回调函数,响应完成后,我们可以执行必要的操作。

简而言之,您需要将依赖于您的响应的东西放置在您的回调中,或者取决于您的回调触发。

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) 
});