web-dev-qa-db-ja.com

Jquery Ajax呼び出し、成功またはエラーを呼び出しません

可能性のある複製:
AJAX関数からの呼び出しから応答を返す方法?

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;//doesnt goes here
            },
            error: function (textStatus, errorThrown) {
                Success = false;//doesnt goes 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:関数は呼び出されていない。この場合、成功は呼び出されましたが、機能していません。

Firebugを使用して、成功またはエラー関数がスキップされ、return Success;に直接移動することがわかりました。

コードの問題を見つけられないようです。

前もって感謝します

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

26
Ruchan

コードを変更します

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;//doesnt goes here
            },
            error: function (textStatus, errorThrown) {
                Success = false;//doesnt goes here
            }

        });
        //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);
29
Wolf

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 Object の詳細を読むことができます

10
Tom Sarduy