2012-09-22 33 views
1

我已经阅读了许多关于该异步不是用户友好的文章,但在下面的过程中,当我删除异步,因为它需要一个一个的执行时,一切搞砸了。jquery中的异步替换

for (var k = 0; k < selectedValueArr.length - 1; k++) { 
    var value = selectedValueArr[k]; 
    $.ajax({ 
     type: "POST", 
     url: dm + "Services/AjaxService.asmx/GetCityCheck", 
     dataType: "json", 
     data: JSON.stringify({ code: value }), 
     contentType: "application/json; charset=utf-8", 
     async: false, 
     success: function(data) { 
      html += '<li style="height: 25px;"><div style="font-weight: bold; background-color: #91c8e2; padding: 3px 3px; font-size: 13px;">' + document.getElementById('stateName' + selectedValueArr[k]).innerHTML + '</div></li>'; 
      var datafromServer = jQuery.parseJSON(data.d.toString()); 
      $.each(datafromServer, function(key, value) { 
       html += '<li style="height: 18px; font-size: 12px;"><span pvalue="' + key + '"><input id="chkCity' + key + '" type="checkbox" title="' + value + '" style="border: 0px;" onchange="javascript:CityCheck(this)"><span title="' + value + '" id="cityName' + key + '">' + value + '</span></span></li>'; 
      }); 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown) { 
      alert(textStatus); 
     } 
    }); 
} 

谁能告诉我什么是替代异步因为它确实挂在浏览器...

回答

1

这里有一个忠告:不是锤击许多AJAX请求您的服务器在一个循环最好是送即使更多数据将通过线路传输,单个AJAX请求中的所有数据也是如此。最好尽量减少服务器往返次数。

所以得到循环摆脱,然后发送一个Ajax请求:

$.ajax({ 
    type: 'POST', 
    url: dm + 'Services/AjaxService.asmx/GetCityCheck', 
    data: JSON.stringify({ codes: selectedValueArr }), 
    contentType: 'application/json; charset=utf-8', 
    success: function(data) { 
     // work with data.d directly here, don't do any $.parseJSON 
     // see below for how you need to modify your WebMethod for 
     // this to work 
     ... 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
     alert(textStatus); 
    } 
}); 

,然后修改您的WebMethod因此,它需要一个数组作为输入参数,返回一个数组作为输出:

[WebMethod] 
public SomeModel[] GetCityCheck(string[] codes) 
{ 
    ...  
} 

请注意,如果WebMethod直接返回模型而不是字符串,则不需要在成功回调中执行任何jQuery.parseJSON,但可以直接使用data.d

如果你不想听从我的建议,并杀死在一个循环AJAX请求你的服务器,你将不得不捕捉k索引变量在封闭:

for (var k = 0; k < selectedValueArr.length - 1; k++) { 
    (function(i) { 
     var value = selectedValueArr[i]; 
     $.ajax({ 
      type: "POST", 
      url: dm + "Services/AjaxService.asmx/GetCityCheck", 
      dataType: "json", 
      data: JSON.stringify({ code: value }), 
      contentType: "application/json; charset=utf-8", 
      context: value, 
      success: function(data) { 
       html += '<li style="height: 25px;"><div style="font-weight: bold; background-color: #91c8e2; padding: 3px 3px; font-size: 13px;">' + document.getElementById('stateName' + this).innerHTML + '</div></li>'; 
       var datafromServer = jQuery.parseJSON(data.d.toString()); 
       $.each(datafromServer, function(key, value) { 
        html += '<li style="height: 18px; font-size: 12px;"><span pvalue="' + key + '"><input id="chkCity' + key + '" type="checkbox" title="' + value + '" style="border: 0px;" onchange="javascript:CityCheck(this)"><span title="' + value + '" id="cityName' + key + '">' + value + '</span></span></li>'; 
       }); 
      }, 
      error: function(XMLHttpRequest, textStatus, errorThrown) { 
       alert(textStatus); 
      } 
     }); 
    })(k); 
} 

还要注意如何,我将context参数用于AJAX请求以将值传递给成功回调。然后在这个成功的回调中,我用这个替换了selectedValue[k],因为当前的上下文现在是不同的。这是将信息从$ .ajax调用的外部上下文传递到成功回调的正确方法。

+0

我怎样才能把多个阵列在一个阵列(SomeModel)是什么? – Zubarik

+0

如果您愿意,您可以使用二维数组:'SomeModel [] []'或'List '。 –

0

你可以尝试做这样的:
- 删除异步:FALS
- 删除for循环
- 重写你的服务器的方法来接受多个“规范”和结果
的输出数组 - 发送到服务器所有要求的“代码”一次
- 当你有你的结果,遍历每个“代码”的结果,并用它做,你想做的事