2012-02-27 13 views
15

バックエンドサービスに接続するためにjQuery.ajax()を使用しています。私はerror()ハンドラとstatusCode()ハンドラを設定しました。どちらも正常に動作しますが、statusCodeハンドラが起動すると、エラーハンドラも起動します(エラーハンドラが最初に起動されます)。私はこれが起こらないことを好むだろう。私はこれがエラーハンドラのコードをハックすることなく可能であると仮定していますか?jQuery ajax - statusCode()コールバックが呼び出されたときのerror()コールバックの回避

私のコードは次のようになります。

$.ajax({ 
    ... 
    error: function(...) { 
     // process a general type of error here 
    }, 
    statusCode: { 
     401: function() { 
      // process a specific authentication failure 
     } 
    }     
}); 

だから、HTTPステータスコードが401であるとき、私はエラー()ハンドラの発火を避けることができますか?

ありがとうございました!

+2

それはあなたが「からstatusCode」ハンドラではfalseを返したときに、それはそれは、Ajaxのイベントは、最大伝播する妨げる作るために、jqueryのチームを要求する価値があるだろうかしら'エラー'ハンドラ。確かにこれは多くの努力を必要とせず、認証されていない要求がすべて同じグローバルハンドラを持つアプリケーションを書くのを容易にします。つまり、ユーザをログイン画面に戻す関数です。 –

+0

@ JoshMc:良いアイデア! – David

答えて

6

jQuery.ajaxをハッキングしないとし、あなたがすることはできません。私にとって、jQueryのajaxメソッドは、ライブラリの痛みの1つです。より賢明なリクエスト処理のために、私はsuperagentまたは他のスタンドアロンライブラリを調べることをお勧めします。

+0

本当に私が聞きたかったものではありませんが、私は答えに近づけることができると思います。ありがとう。 –

0

チェックアウト誤差法でステータスコードの取り扱いについては、この記事で答え:how to get jquery ajax status code

+0

'error()'は 'fail()'の呼び出しを防ぎません。 – Francisc

10

エラーコールバック内のステータスコードを簡単に確認できます。最初のパラメータはXMLHttpRequest(またはご使用のバージョンのjQueryでdepittingしているjqHXR)オブジェクトである必要があります。それに応じてエラーハンドルのステータスコードの 'status'プロパティを確認します。

など。

error: function(a, b, c){ 
    if(a.status != 401){ 
    // handle other errors except authentication 

    } 
} 
+0

はい、元の投稿に記載されているように、エラーハンドラをハックする必要はありません。私がちょっと奇妙なことに私を襲うこのことはできないと分かっています。 –

+0

@LeeFrancis、ああ、私はあなたが何を意味するかを見ます。あなたは$ .ajax呼び出しを使用するラッパーを書くことができませんでした。エラーハンドラでどのステータスコードを抑制するかを指定できますか?私はすべてのアヤックスコールのライターラッパーですので、私は1か所で微調整ができます。ちょっと考えました... –

+0

はい、多かれ少なかれ私が最後にやったことです。しかし、状況コードを手動でチェックしているときにライブラリの事前定義されたハンドラを利用できるようにする目的(成功など)を破っているような気がします。 –

2

あなたは自動的にあなたのAjaxリクエストのエラーハンドラを微調整するajaxSetupとbeforeSendを使用して試すことができます:

$.ajaxSetup({ 
    beforeSend: function(jqXHR, settings) { 
    if (typeof settings.error === 'function') { 
     var errorfunc = settings.error; 
     settings.error = function(jqXHR2, textStatus, errorThrown) { 
     if (jqXHR2.status !== 401) errorfunc(jqXHR2, textStatus, errorThrown); 
     }; 
    } 
    } 
}); 

私の場合、これは動作します。

+0

非常に良い。しかし、エラーハンドラが '$ .ajax'によって返された遅延で' fail() 'で設定されているときに動作させることができますか? – Francisc

+0

私は試していませんが、jQuery jqXHRオブジェクトのコールバック実行順序に従って(エラーの前にエラーが発生しました。http://api.jquery.com/jQuery.ajax/を参照)、おそらく関数内の遅延コールバックを変更できます元のsettings.errorを置き換えます。 – user2043553

5

汎用イベントハンドラを起動したくないステータスコードをハードコードする必要がある以前の回避策を改善しました。 beforeSendは、他の目的のために上書きされる可能性があり、あなたはのでうっかりこれらの呼び出しの一般的なエラーハンドラを起動することができますので、

私の意見では、あなたのエラーハンドラを編集する方が安全です。 (beforeSendコールバックを変更すると、エラー処理に影響を与えるエラーコールバックを上書きします)。

だから、あなたが得るでしょう:

function ajaxError (jqXHR, textStatus, errorThrown) 
{ 
    if (jqXHR.status in this.statusCode) return; 
    // Handle generic events here. 

} 
+0

これはかなり賢いです。 – Francisc