19

この種の質問に対する多くの回答を確認しましたが、今では最善の方法について混乱しています。最新のjqueryを考えると、私はしたいです

  1. ajax 関数を呼び出す
  2. ajax 処理を行う (成功またはエラー) // 正常に動作する
  3. 成功またはエラーの場合、さらなる処理のために呼び出し元の関数にステータスを返します

呼び出し関数 (doAjax) で、コールバックを待ってから、成功またはエラーの処理を完了するにはどうすればよいですか (この場合、成功した場合はフォームをクリアし、エラーの場合はそのままにしておきます)

アドバイスがあればthx、

アート [編集] お気づきのようにタイプミスがありました。呼び出しは 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

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:trueに変更できますasync:falseが、実際には SJAX 呼び出しになります (用語が存在するかどうかさえわかりませんが、技術的にはもはや AJAX 呼び出しではありません)。

于 2012-07-20T09:05:46.550 に答える
0

jquery の 'derferred' を確認してください。以下の例では、非同期をオフにして deferred.done を使用しています。

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