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

时间:2013-07-15 22:27:58

标签: javascript jquery ajax

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

由于请求似乎是异步的,如何修改我的代码以同步使用请求中的数据?

如果我在这里遗漏了一些明显的东西,我道歉...

4 个答案:

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