jQuery AJAX呼び出しの「finally」に類似したものはありますか?


84

jQuery AJAX呼び出しにJavaの「最終的に」類似物はありますか?私はここにこのコードを持っています。私はいつも例外をスローしますが、常に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/


ちょうどにそれを追加always...
デヴィッドFregoli

1
非同期でスローされたエラーをキャッチすることはできません。それがあなたが探しているものです。try-catch-finally自分でステートメントにラップする必要があります。
ベルギ2013

3
それは常に、それがそのように適切な名前だ理由です、常に()関数になります。
adeneo 2013

jQueryがコールバックのすべてのtry / catchを処理しない限り、throw "something";コードの実行を停止するだけです。
plalx 2013

@Bergi、私はjQueryのpromise implに精通していませんが、Promises / A +に準拠している場合、スローされたエラーは、そのときに渡されたerrorHandlerに渡されます。したがって、彼が2番目の関数をthenに渡すと、パラメーターとして「何か」を受け取ります。
David McMullin 2013

回答:


130

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

$.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/をご覧ください。


27
.complete()非推奨になりました。.always()今すぐ使用してください。api.jquery.com/jQuery.ajax
mlg 2016

4
FUNFAR動詞が好き:D
Bruno Rodrigues

4
@mlg:completeパラメータは非推奨ではなく、.complete()コールバックのみが非推奨になりました。これは、jqXHRオブジェクトがPromiseインターフェイスを実装しているためです。:この質問への回答を参照してくださいstackoverflow.com/questions/15821141/...
jeanie77

45

.always()動作するはずです。参照してくださいザ・jqXHRオブジェクトでセクションを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/も参照してください


11

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

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");
});

jQuerythenはコールバックでエラーをキャッチしません。でしたあなたはこれを試してみてください?
ベルギ2013

申し訳ありませんが、then-> alwaysを使用して、thenに2つの関数を入れてみましたが、それでも同じ問題が発生します。
オリバーワトキンス2013

心からお詫び申し上げます。jqueryの延期されたドキュメントを見て、これでうまくいくと思いましたが、明らかに間違っていたので、Bergiはサンドボックスにチェックインする必要があると正しく指摘しました。
David McMullin 2013


2

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

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

申し訳ありませんが悪い英語!乾杯;-)


1

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

$(document).ajaxComplete(function () {
    console.log('ajax complete on doc');
})
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.