Дождитесь ответа на вызов jquery ajax от вызывающей функции

Я просмотрел много ответов на этот вопрос, и теперь я смущен относительно наилучшего способа. Учитывая последний jquery, я хочу

  • Вызов функции ajax
  • выполнить обработку ajax (успех или ошибка)//отлично работает
  • при успешном выполнении или ошибке возвращает статус вызывающей функции для дальнейшей обработки

в вызывающей функции (doAjax), как я могу подождать обратного вызова, а затем завершить обработку для успеха или ошибки (в этом случае его успех удалит форму, по ошибке сохраните ее как есть)

спасибо для любых советов,

Искусство [EDIT] Там была опечатка, как вы, ребята, заметили, звонок должен был быть doAnAjax not doAjax

$(function () {
    doAnAjax(Url, data, function (myRtn) {
        if (myRtn == "success") {
            resetForm($('#myForm'));
            resetForm($('form[name=addChlGrp]'));
        } else {
            $('.rtnMsg').html("Opps! Ajax Error");
        }
    });
});

function doAnAjax(newUrl, data) {
    $.ajax({
        url: newUrl,
        async: true,
        dataType: 'html',
        beforeSend: function () {
            $('.rtnMsg').html("<img src=_cssStyleImg_-A-loading.gif>");
        },
        type: "GET",
        data: data,
        cache: false,
        success: function (data, textStatus, xhr) {
            $('.rtnMsg').html(data);
            myRtnA = "Success"
            return myRtnA;
        },
        error: function (xhr, textStatus, errorThrown) {
            $('.rtnMsg').html("opps: " + textStatus + " : " + errorThrown);
            myRtnA = "Error"
            return myRtnA;
        }
    });
}

Ответ 1

Вы должны использовать функцию обратного вызова. Попробуйте следующее:

$(function() {

   // I think doAjax should doAnAjax()
   // here you're passing callback
   // but you're not using it doAnAjax()

    doAnAjax(Url, data, function(myRtn) {
        if (myRtnV == "success") {
            resetForm($('#myForm'));
            resetForm($('form[name=addChlGrp]'));
        } else {
            $('.rtnMsg').html("Opps! Ajax Error");
        }
    });
});

// pass callback as third parameter to doAnAjax()

function doAnAjax(newUrl, data, callBack) {
    $.ajax({
        url: newUrl,
        async: true,
        dataType: 'html',
        beforeSend: function() {
            $('.rtnMsg').html("<img src=_cssStyleImg_-A-loading.gif>");
        },
        type: "GET",
        data: data,
        cache: false,
        success: function(data, textStatus, xhr) {
            $('.rtnMsg').html(data);
            myRtnA = "Success"
            return callBack( myRtnA );  // return callBack() with myRtna
        },
        error: function(xhr, textStatus, errorThrown) {
            $('.rtnMsg').html("opps: " + textStatus + " : " + errorThrown);
            myRtnA = "Error"
            return callBack ( myRtnA ); // return callBack() with myRtna
        }
    });

Ответ 2

Как упоминалось ранее, использование обратных вызовов.

function process(url, params, successCallback, errorCallback) {
    $.ajax({
        success : successCallback,
        error : errorCallback,
        data : params,
        url : url,
        type : 'POST',
        dataType : 'json'
    });
}

process(
    'http://www.google.co.uk', 
    { 
        param1 : 'a' 
    }, 
    function(resp) { 
        alert('Success');
    },
    function() {
        alert('Uh oh');
    }
);

Затем вы можете передать любую функцию в process, и она будет вызвана на успех/ошибку.

Ответ 3

Ответ: вы этого не делаете, но это легко достижимо. Идея AJAX заключается в асинхронности, поэтому A JAX. Это означает, что функция, которая изначально вызывает ваш ajax, не будет ждать завершения, и вместо этого вся работа будет завершена после того, как вызов ajax должен быть в обработчиках успеха или ошибок.

Если вам нужно что-то синхронное, вы можете изменить свой флаг от async:true до async:false, но тогда он станет действительно вызовом SJAX (даже не уверен, что этот термин существует, но технически он больше не является вызовом AJAX).

Ответ 4

Отметьте "derferred" в jquery. В приведенном ниже примере используется отложен. С асинхронным отключением и, похоже, работает для меня.!

$.ajax({
    url: "http://www.whatever.com/whatever",
    async: false }).done(function( data ) {
        alert(data); //or whatever
    })