Подтвердить что ты не робот

JQuery Ajax Call, не вызывает успех или ошибку

Возможный дубликат:
Как вернуть ответ от вызова 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. Значение также изменяется. Но после службы успех: или : функции не называются в этом случае успех должен был быть вызван, но он не работает.

Я использовал firebug и обнаружил, что функции успеха или ошибки пропускаются и переходят непосредственно к return Success;

Кажется, не удается найти, в чем проблема с кодом.

Заранее спасибо

Update: добавив async: false исправил проблему

4b9b3361

Ответ 1

измените свой код на

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

Update:

jquery ajax-вызовы по умолчанию асинхронны. Таким образом, функции успеха и ошибки будут вызваны при завершении загрузки ajax. Но ваш оператор return будет выполнен сразу после запуска вызова ajax.

Лучшее aproach будет

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

Ответ 2

Попробуйте инкапсулировать вызов 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 можно прочитать