在" for"中的Ajax请求环。反击的意外行为

时间:2014-10-15 13:39:30

标签: jquery ajax performance

我遇到以下代码块问题:

function MediaImport4pr(nbr) {
    $("#latestPr ul.list").empty();

    $.ajax({
        url: "/aQ_OX/local/LATESTPR/LatestPr.txt",
        dataType: "text",
        success: function(data) {
            //var array = data.split(',');
            var array = data;
            var arrayWithRightNumberOfPr = ["tst4_01-11-2014.aspx", "tst1_11-06-2014.aspx", "tst2_10-05-2014.aspx", "tst5_27-03-2014.aspx"];
            for (im = 0; im < arrayWithRightNumberOfPr.length; im++) {
                AjaxRequest(im, arrayWithRightNumberOfPr);
            }


        }
    });
}



function AjaxRequest(im, array) {
    $.get("/aQ_OX/LOCAL/ASPXGENERATED/" + array[im], function(data) {
        var targetTitle = $(data).find('#title').html();
        var targetDate = $(data).find('#date').html();
        var targetPdf = $(data).find('#pdf').html();

        if (targetPdf != "noPDF") {
            $("#latestPr ul.list").append("<li class='item pr" + im + "'><p class='date'>" + targetDate + "</p><ul><li class='title'><a class='title' href='/aQ_OX/LOCAL/ASPXGENERATED/" + array[im - 1] + "'>" + targetTitle + "</a></li><li class='pdf'><a class='pdf' href='" + targetPdf + "'>PDF</a></li></ul></li>");
        } else {
            $("#latestPr ul.list").append("<li class='item pr" + im + "'><p class='date'>" + targetDate + "</p><ul><li class='title'><a class='title' href='/aQ_OX/LOCAL/ASPXGENERATED/" + array[im - 1] + "'>" + targetTitle + "</a></li></ul></li>");
        }
    });
}

基本上,这段代码生成“li”标签,问题是“for”循环每次运行时都会以非常不同的数字开头。 我只是期望0,1,2,3等,但有时我有0,1,3,4或2,3,0,1等......

  1. 我的代码中有什么问题?
  2. 除了这个错误,这个代码运行良好,但我有一个性能问题,显示需要3秒。它太长了。我不是在寻找性能最好的代码,但更快的东西会受到赞赏! 感谢您的推荐......

1 个答案:

答案 0 :(得分:1)

不是实际问题,而是良好做法:通过添加im使循环计数器var成为本地的(它当前是全局的,因此在所有并行调用MediaImport4pr时共享)

for (var im = 0; im < arrayWithRightNumberOfPr.length; im++)

无法保证订单:

问题完全在于期望Ajax结果的顺序与请求相同......但是Ajax不能保证哪些请求会先返回。您需要确保响应中有足够的信息,以便按所需顺序将结果插入显示中(并且不假设有关传入订单的任何信息)。

减少请求:

第二个时间问题是服务器的响应时间和请求数。检查您要发送的多个请求的网络流量和时间安排(例如,通过F12 Chrome调试工具,网络标签)。

基本上,您发生了“大量”网络呼叫,浏览器将限制同时进行的Ajax呼叫数量。也许组合成更少的调用返回更多的数据?在这种情况下,具有10倍数据的单个请求优于10个较小的调用。这也将解决排序问题,因为返回结果数组将由服务器预定义:)