19

我已经查看了很多此类问题的答案,现在我对最好的方法感到困惑。鉴于最新的 jquery,我想

  1. 调用一个ajax函数
  2. 做ajax处理(成功或错误)//工作正常
  3. 在成功或错误时将状态返回给调用函数以进行进一步处理

在调用函数(doAjax)中,我如何等待回调然后完成成功或错误的处理(在这种情况下,成功时清除表单,出错时保持原样)

谢谢任何建议,

艺术 [编辑] 你们发现有一个错字,电话应该是 doAnAjax 而不是 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;
        }
    });
}
4

4 回答 4

18

你必须使用回调函数。在下面试试这个:

$(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
        }
    });
于 2012-07-20T09:25:40.160 回答
4

如前所述,使用回调。

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它,它将在成功/错误时被调用。

于 2012-07-20T09:15:57.037 回答
2

答案是你没有,但它很容易实现。AJAX 的思想是异步的,因此是A JAX。这意味着最初调用 ajax 的函数不会等待它完成,而是在 ajax 调用之后完成的所有工作都应该在成功或错误处理程序中。

如果您需要同步的东西,您可以将标志从更改为async:trueasync:false但它实际上变成了 SJAX 调用(甚至不确定该术语是否存在,但从技术上讲,它不再是 AJAX 调用)。

于 2012-07-20T09:05:46.550 回答
0

在 jquery 中查看“延迟”。下面的示例使用 deferred.done 并关闭了异步,并且似乎对我有用。!

$.ajax({
    url: "http://www.whatever.com/whatever",
    async: false }).done(function( data ) {
        alert(data); //or whatever
    })
于 2013-10-16T14:44:41.090 回答