1

我读过很多关于异步不是用户友好的文章,但是在下面的过程中,当我删除异步时一切都搞砸了,因为它需要一个一个地执行。

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);
        }
    });
} 

谁能告诉我什么是异步的替代品,因为它真的会挂起浏览器......

4

2 回答 2

1

这里有一个建议:与其在一个循环中用许多 AJAX 请求锤击您的服务器,不如在一个 AJAX 请求中发送所有数据,即使更多数据将通过线路传输。尽量减少服务器往返总是更好的。

所以摆脱 for 循环,然后发送一个 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 调用的外部上下文向成功回调传递信息的正确方法。

于 2012-09-22T08:57:43.127 回答
0

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

于 2012-09-22T09:03:55.327 回答