等待来自调用函数的jquery ajax回调

时间:2012-07-20 09:00:21

标签: jquery ajax callback

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

  1. 调用ajax函数
  2. 执行ajax处理(成功或错误)//正常工作
  3. 成功或错误将状态返回给调用函数以进行进一步处理
  4. 在调用函数(doAjax)中,如何等待回调然后完成成功或错误的处理(在这种情况下,它成功清除表单,出错时保持原样)

    任何建议,

    艺术 的 [编辑] 你们发现有一个错字,打电话应该是doAnAjax不做阿贾克斯

    $(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 个答案:

答案 0 :(得分: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
        }
    });

答案 1 :(得分:4)

如前所述,使用Callbacks。

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

答案 2 :(得分:2)

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

如果你需要同步的东西你可以将你的旗帜从async:true更改为async:false但是它真的变成了一个SJAX调用(甚至不确定该术语存在但是,从技术上来说它不是一个AJAX调用了)。

答案 3 :(得分:0)

在jquery中查看'derferred'。下面的示例使用deferred.done,异步关闭,似乎对我有效。!

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