依赖带有ajax请求的循环

时间:2014-04-06 14:04:36

标签: javascript jquery ajax loops

嗨我使用jquery在一些构建html表的循环中运行几个ajax请求。

如何让它们按特定顺序运行?

我尝试了$ .when然后在我的情况下,似乎只能使用async:false,

我有两个主要功能

1)在循环中构建ajax请求URL

for (var i = 0; i < split.length; i++) {   
    zeile = split[i];

    request = $.ajax({
        url: "url.php?q=" + zeile,

然后绘制基本表

success: function(data) {
            $.each(data.data, function(key, val) {
                p = p + "<td>...</td>"     
                p = p + "<td>...</td>"                
                p = p + "</tr>";
                $("#htmlergebnis").append(p);    

在完成所有不同的请求并绘制完整的表之后,我想运行第二个函数,该函数现在添加来自另一个数据源的表格单元格。因此,它使用每个现有行(由第一个循环绘制)中的值作为另一个请求的搜索值

 $(".ergebniszeile" ).each(function(key) {  
    ...

    var str = "url2.php?q=" + zeile;
        $.ajax({
            url: "" + str,
            type: 'GET',
            dataType: 'JSON',
            success: function(data) {  
                $("#"+rowid+"").children(".value2").append(data.value2);

我还测试了.ajaxComplete和.ajaxStop,但它们似乎可以处理任何ajax请求而不是循环内的特定请求组。

我认为问题是构建ajax网址的循环。它不是ajax请求相互依赖,而是循环带有ajax请求。

结果看起来+相应的请求将按此顺序构建

 <tr><th>loop 1</th><th>loop 1</th><th>loop 1</th><th>loop 2</th><th>loop 2</th><tr>
 <tr><td>request 1</td><td>request 1</td><td>request 1</td><td>request 4</td><td>request 4</td></tr>
 <tr><td>request 1</td><td>request 1</td><td>request 1</td><td>request 5</td><td>request 5</td></tr>
 <tr><td>request 1</td><td>request 1</td><td>request 1</td><td>request 6</td><td>request 6</td></tr>
 <tr><td>request 2</td><td>request 2</td><td>request 2</td><td>request 7</td><td>request 7</td></tr>
 <tr><td>request 2</td><td>request 2</td><td>request 2</td><td>request 8</td><td>request 8</td></tr>
 <tr><td>request 3</td><td>request 3</td><td>request 3</td><td>request 9</td><td>request 9</td></tr>
 <tr><td>request 3</td><td>request 3</td><td>request 3</td><td>request 10</td><td>request 10</td></tr>

1 个答案:

答案 0 :(得分:0)

我不会专注于使请求同步(按特定顺序),这只会减慢你的速度 - 无论返回的数据真的非常大 - 最好是并行请求。

我要做的是解耦数据(请求)的提取 - 这可以完美地异步完成 - 以及表的实际呈现。

因此,您可以例如只是启动第一个填充表的主位的请求,然后在您准备好的时候启动其他请求。关于这些调用是否成功,只需将结果存储在一个数组中(连同请求的​​密钥),当所有请求完成后,按顺序浏览存储的结果(因为请求的密钥也存储)并且然后生成表。

顺便说一句,而不是连接字符串

            p = p + "<td>...</td>"     
            p = p + "<td>...</td>"                
            p = p + "</tr>";

使用数组+连接:

            var sb = [];
            sb.push("<td>...</td>");
            sb.push("<td>...</td>");
            sb.push("</tr>");

            p += sb.join('');