web-dev-qa-db-ja.com

jQuery AJAX呼び出しに「最後に」の類似物はありますか?

JQueryにJava 'finally'アナログAJAX呼び出しですか?このコードはここにあります。always例外をスローしますが、常にthen()メソッドに移動するようにします。

    call.xmlHttpReq = $.ajax({
        url : url,
        dataType : 'json',
        type : 'GET'
    }).always(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

       throw "something";

    }).then(function() {

        alert("i want to always run no matter what");
    });

私はdone()complete()、および別のalways()が、何も機能しないようです。

JSFiddleは次のとおりです。

http://jsfiddle.net/qv3t3L0m/

61
Oliver Watkins

この例を参照してください。

$.ajax({
        type: "GET",
        dataType: dataType,
        contentType: contentType,
        async: TRUE,
        url: $('html form:nth-child(1)').attr('action') + "?" $('html form:nth-child(1)').serialize(),
        success: function(data) {
            console.log("FUNFOU!");
        },
        error: function(data) {
            console.log("NÃO FUNFOU!");
        },
        complete: function(data) {
            console.log("SEMPRE FUNFA!"); 
            //A function to be called when the request finishes 
            // (after success and error callbacks are executed). 
        }
    });

詳細情報: http://api.jquery.com/jquery.ajax/

.always()は動作するはずです。 The jqXHR Objectセクション( http://api.jquery.com/jQuery.ajax/

jqXHR.always(function(data | jqXHR、textStatus、jqXHR | errorThrown){});完全なコールバックオプションの代替構成である.always()メソッドは、廃止された.complete()メソッドを置き換えます。

リクエストが成功した場合、関数の引数は.done()の引数と同じです:data、textStatus、jqXHRオブジェクト。失敗したリクエストの場合、引数は.fail()の引数と同じです:jqXHRオブジェクト、textStatus、およびerrorThrown。実装の詳細については、deferred.always()を参照してください。

http://api.jquery.com/deferred.always/ も参照してください

37
jrummell

JQueryのpromise実装は、それまでに渡されたメソッドでスローされたエラーを処理しないため、以下の提案はjQueryでは機​​能しません。ここでは、jQueryがpromise/A +に準拠している場合に可能なことの説明としてのみここに残しています。 Bergiが正しく指摘しているように、独自のtry catchブロックでコードを手動でラップする必要があります。

call.xmlHttpReq = $.ajax({
    url : url,
    dataType : 'json',
    type : 'GET'
}).then(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

   throw "something";

}).always(function() {

    alert("i want to always run no matter what");
});

Jqueryのpromiseが常にサポートするかどうかはわかりませんが、代わりにthen(再び)を使用して、次のようにsuccessHandlerとerrorHandlerの両方と同じ関数を渡すことができます。

call.xmlHttpReq = $.ajax({
    url : url,
    dataType : 'json',
    type : 'GET'
}).then(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

   throw "something";

}).then(function() {

    alert("i want to always run no matter what");
},
function() {

    alert("i want to always run no matter what");
});
8
David McMullin

JQuery 3.0以降を使用する人への注意

非推奨の通知:jqXHR.success()、jqXHR.error()、およびjqXHR.complete()コールバックは、jQuery 3.0から削除されました。代わりにjqXHR.done()、jqXHR.fail()、およびjqXHR.always()を使用できます。

公式ドキュメントのように

2

Ajaxはサーバーに依存するバグがあります。「完了」でステータスを確認する必要があり、「成功」、「エラー」などの種類はPUTの100%ではありません、POSTおよびGET ...例を見る

$.ajax({
    url: '/api/v2/tickets/123456.json',
    ....
    ....
    ....
    complete: function(data) { 
        if (data.statusText == "success") { 
            console.log("Sent successfully");
        } else { 
            console.log("Not Sent");
        }
    }
});

申し訳ありませんが、悪い英語です!応援;-)

1
KingRider

すべてのajaxリクエストに1つのコード定義が必要な場合は、次のようにできます

$(document).ajaxComplete(function () {
    console.log('ajax complete on doc');
})
0
sairfan