【问题标题】:Ajax Call loop, Ajax jQueryAjax 调用循环,Ajax jQuery
【发布时间】:2012-03-03 23:43:17
【问题描述】:

我需要和建议在这里。

我有这种情况,试图获取一些 JSON 数据,想到了 AJAX(使用 jQuery)。

想法就是这样,我需要更多的数据然后 1 或 2 个 Ajax 调用来获取我需要的所有数据。

因此,我需要进行多次 Ajax 调用,并尝试找出最佳方法(最佳实践)。

我首先想到的一个想法是这样的(它可能有一些语法错误甚至更糟,现在正在寻找逻辑):

var dataArr = {
    page:0,
    pageSize : 1000
};


var StoreData = [];

var getSomeData = function () {

    $.ajax({
        type : "GET",
        url : URL,
        data : dataArr,
        dataType : "json",
        error : OnLoadError,
        success :function(data, status){

            StoreData.push[data];
            if(data.length){
                dataArr.page = dataArr.page + 1
                getSomeData();
            }

        }
    });
};

附加信息:

大约需要 4-9 次 Ajax 调用来获取所有数据(4000-9000 项)。

我测试了pageSize : 1000 并且工作正常,因此每次通话我可以确保获得 1000 件物品。

因此,如果您能提供一些建议,对现有的一种或另一种更好的方法进行一些更改,或者甚至是一些示例,我真的很感激

谢谢大家!

【问题讨论】:

    标签: javascript jquery ajax json loops


    【解决方案1】:

    您可以在完成后在服务器端设置一个标志,并将其放入您的状态参数中以实现成功功能。那会清理你的代码。否则,您可以简单地添加一个 while 循环,将您的调用定义为同步并检查它是否在循环条件内完成。

    【讨论】:

    • 很遗憾,我只能使用客户端站点
    • 您的方法似乎一点也不错。最后你只收到了一个额外的请求。尽量避免这种情况,方法是在实际执行 ajax 调用之前添加条件。 //更新 - 我只是想,你不能..如果你没有检查,你甚至不知道它是否为空。
    • 好吧,让我们面对事实吧。您收到了未定义数量的请求,您没有任何服务器端报告告诉您是否收到了最后一个包。我没有更好的主意,就像你做的那样并添加额外的请求。但是,嘿,如果它不是您的服务器,您不必担心,对吧? ;)
    • 正确。如果有一些数据,那很好,如果没有,我只打1个电话,检查没有数据,我已经不在乎了
    • 我认为这是你能做的最好的。它不是最干净的方法。但你必须忍受它,只要你有这些限制。
    【解决方案2】:

    首先,您需要优化页面大小。将其定义为 1000 是一种简单的方法。如果应用程序的性能不重要,请不要阅读此答案的其余部分:)

    我建议采用基于反复试验的方法。制作一个 for 循环,尝试不同的页面大小数字(如 20、50、100、500、1000、1500 等)。然后记录每个页面大小的请求数,以及所有请求的总时间。比较这些数字,然后明智地选择您的页面大小。

    其次,如果您能够计算来自服务器的元素数量,那么您最终可能不必发送不必要的请求。假设你得到 4650 个数据。你得到 1000、+1000、+1000、+1000 和 +650。如果你以某种方式发现你得到的少于 1000,你就不会发送最后一个请求,对吗?假设响应格式类似于:

    <li class='item'>XXX</li>
    // All list items 
    <li class='item'>YYY</li>
    

    然后用jquery统计li的个数,如果小于你的页面大小,就说明你得到了你需要的所有数据。

    最后,如果您知道您的总数据长度超过 4000,您可能希望异步发送前 4 个请求。

    【讨论】: