2012-09-22 64 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循環
- 重寫你的服務器的方法來接受多個「規範」和結果
的輸出數組 - 發送到服務器所有要求的「代碼」一次
- 當你有你的結果,遍歷每個「代碼」的結果,並用它做,你想做的事