1

非同期はユーザーフレンドリーではないという記事をたくさん読みましたが、次の手順では、非同期を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);
        }
    });
} 

本当にブラウザがハングアップするので、誰かが async の代わりになるものを教えてもらえますか...

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)
{
    ...    
}

jQuery.parseJSONWebMethod が文字列ではなくモデルを直接返す場合、成功のコールバック内で何もする必要はなく、直接 を操作することに注意してください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]次に、この成功コールバック内で、現在のコンテキストが異なるため、 を thisに置き換えました。これは、$.ajax 呼び出しの外側のコンテキストから成功のコールバックに情報を渡す適切な方法です。

于 2012-09-22T08:57:43.127 に答える
0

次のように試みることができます:
-非同期を削除します:fals
-forループを削除します
-複数の「コード」を受け入れて結果の配列を出力するようにサーバーメソッドを書き直します
-要求されたすべての「コード」を一度にサーバーに送信します
-あなたの結果は、各「コード」の結果を繰り返し、それを使って、あなたがやりたいことをします

于 2012-09-22T09:03:55.327 に答える