32

重複の可能性:
非同期呼び出しから応答を返すにはどうすればよいですか?

Jquery Ajax を使用してサービスを呼び出し、値を更新しています。

function ChangePurpose(Vid, PurId) {
    var Success = false;
    $.ajax({
        type: "POST",
        url: "CHService.asmx/SavePurpose",
        dataType: "text",
        data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            Success = true;//doesn't go here
        },
        error: function (textStatus, errorThrown) {
            Success = false;//doesn't go here
        }

    });
    //done after here
    return Success;
}

およびサービス:

[WebMethod]
public string SavePurpose(int Vid, int PurpId)
{
    try 
    {
        CHData.UpdatePurpose(Vid, PurpId);
        //List<IDName> abc = new List<IDName>();
        //abc.Add(new IDName { Name=1, value="Success" });
        return "Success";
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

サービスはAJAXから正常に呼び出されています。値も変更されています。しかし、サービスの後、success:またはerror:関数が呼び出されていません。この場合、success が呼び出されているはずですが、機能していません。

私はfirebugを使用しましたが、成功またはエラー関数がスキップされ、直接に行くことがわかりましたreturn Success;

コードの何が問題なのかを見つけることができないようです。

更新: 追加async: falseすると問題が修正されました

4

2 に答える 2

29

コードを次のように変更します。

function ChangePurpose(Vid, PurId) {
    var Success = false;
    $.ajax({
        type: "POST",
        url: "CHService.asmx/SavePurpose",
        dataType: "text",
        async: false,
        data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            Success = true;
        },
        error: function (textStatus, errorThrown) {
            Success = false;
        }
    });
    //done after here
    return Success;
} 

関数からのみ値を返すことができsynchronousます。それ以外の場合は、を作成する必要がありますcallback

だから私async:false,はあなたのajax呼び出しに追加しました

アップデート:

jquery ajax 呼び出しはデフォルトで非同期です。そのため、ajax の読み込みが完了すると、成功関数とエラー関数が呼び出されます。ただし、return ステートメントは、ajax 呼び出しが開始された直後に実行されます。

より良いアプローチは次のとおりです。

     // callbackfn is the pointer to any function that needs to be called
     function ChangePurpose(Vid, PurId, callbackfn) {
        var Success = false;
        $.ajax({
            type: "POST",
            url: "CHService.asmx/SavePurpose",
            dataType: "text",
            data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
            contentType: "application/json; charset=utf-8",
            success: function (data) {
                callbackfn(data)
            },
            error: function (textStatus, errorThrown) {
                callbackfn("Error getting the data")
            }
        });
     } 

     function Callback(data)
     {
        alert(data);
     }

ajax を次のように呼び出します。

 // Callback is the callback-function that needs to be called when asynchronous call is complete
 ChangePurpose(Vid, PurId, Callback);
于 2013-01-23T09:12:56.127 に答える
11

ajax 呼び出しを関数にカプセル化し、async オプションを false に設定してみてください。このオプションは、jQuery 1.8 以降では推奨されていないことに注意してください。

function foo() {
    var myajax = $.ajax({
        type: "POST",
        url: "CHService.asmx/SavePurpose",
        dataType: "text",
        data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
        contentType: "application/json; charset=utf-8",
        async: false, //add this
    });
    return myajax.responseText;
}

これもできます:

$.ajax({
    type: "POST",
    url: "CHService.asmx/SavePurpose",
    dataType: "text",
    data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
    contentType: "application/json; charset=utf-8",
    async: false, //add this
}).done(function ( data ) {
        Success = true;
}).fail(function ( data ) {
       Success = false;
});

jqXHR jQuery オブジェクトの詳細を読むことができます

于 2013-01-23T09:17:25.793 に答える