jQuery 多个 getJSON 请求

发布于 2024-11-03 20:12:09 字数 381 浏览 0 评论 0原文

我的脚本需要在 https://graph.facebook.com/xxxx 上获取多个 json 文件,并检索每个json中的某个字段,然后计算求和。

我的问题是如何在所有 getJSON 完成后打印出结果?使用下面的代码,它将打印 0。请随意建议任何更好的方法。

var result = 0;
$.each(urls, function (i, url) {
    $.getJSON(url, function (json) {
        result += json.field1;
    })
});
alert(result);

My script needs to fetch several json files on https://graph.facebook.com/xxxx, and retrieve a certain field from each json, then calculate summation.

My problem is how to print out the result after all getJSON done? With below code it will prints 0. Feel free to suggest any better approaches.

var result = 0;
$.each(urls, function (i, url) {
    $.getJSON(url, function (json) {
        result += json.field1;
    })
});
alert(result);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

疯了 2024-11-10 20:12:09

使用 jQuery 1.5 延迟对象:

累积 $.getJSON() 返回的 JQXHR 对象数组,

var jxhr = urls.map(function(url) {
    return $.getJSON(url, function(json) {
        result += json.field1;
    })
});

并且只有 $.when 它们都是 .done()

$.when.apply($, jxhr).done(function() {
    alert(result);
});

注意:这将按照 AJAX 调用完成的顺序累积结果,而不是按照调用的顺序。

Using jQuery 1.5 deferred objects:

Accumulate an array of the JQXHR objects returned by $.getJSON()

var jxhr = urls.map(function(url) {
    return $.getJSON(url, function(json) {
        result += json.field1;
    })
});

and only $.when they're all .done():

$.when.apply($, jxhr).done(function() {
    alert(result);
});

NB: this will accumulate result in the order that the AJAX calls complete, not in the order they're made.

慢慢从新开始 2024-11-10 20:12:09

当您立即打印结果时,它不起作用,请记住,连接结果的代码是回调,因此会在警报后触发。

在每次回调时,您必须检查所有回调是否已完成。将alert() 调用替换为您的处理。 :)

    var result = 0;
    var doneCount = 0;

    $.each(urls, function (i, url) {
        $.getJSON(url, function (json) {
            doneCount++;
            result += json.field1;
            if (doneCount == urls.length) {
                alert(result);
            }
        })
    });

It's not working as you are printing the result straight away, remember that the code where you concatenate the result is a callback so will fire after your alert.

On each callback you'll have to check if all have finished. replace the alert() call with your processing. :)

    var result = 0;
    var doneCount = 0;

    $.each(urls, function (i, url) {
        $.getJSON(url, function (json) {
            doneCount++;
            result += json.field1;
            if (doneCount == urls.length) {
                alert(result);
            }
        })
    });
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文