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

结果:

Outside request: 0
Inside request: 25

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

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

4

4 回答 4

1

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

于 2013-07-15T22:31:20.527 回答
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);

);
于 2013-07-15T22:31:45.577 回答
1

因为 AJAX 是异步的alert,所以上面的代码将在执行完成后立即被触发getFeed

问题是,getFeed 不会等待 $.getJSON 返回响应来完成执行,它会设置 AJAX 请求,将其发送出去,然后立即完成执行,到那时,服务器已经响应的可能性很小$.getJSON 请求。

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

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

于 2013-07-15T22:32:34.400 回答
1

因为它是一个 JSONP 请求,所以你不能真正做到这一点。JSONP 请求是通过创建<script>以 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)
});
于 2013-07-15T22:35:31.393 回答