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

wait for a jquery ajax callback from calling function

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

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

    感谢任何建议,

    艺术
    [编辑]
    你们发现有一个错字,应该是doAnAjax而不是doAjax

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    $(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
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    $(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
            }
        });


    如前所述,使用Callbacks。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    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,并在成功/错误时调用它。


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

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


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

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