2013-07-23 5 views
7

jQuery XHR($ .get()呼び出しから作成された)のハンドラで、応答の問題を探して登録された後続カスタムエラーメッセージが表示されるハンドラ(うまくいって&に失敗します)?このようなjQuery AJAXまたはXHRリクエストトリガーが完了コールバックからのコールバックを失敗しました

何か:Doneを二次フィルタの

$.get(URL) 
.done(
    function (data, status, res) { 
    if(/*some condition*/){ 
      this.Reject(res, status, "some reason"); 
      return  
     } 
    //Do stuff on success 
    } 
) 

.fail(
//Common error handler here 
) 
.always(
    //common always handler here 
); 

種類。理由は、もちろん、jQueryが認識できなかった200の応答でエラーを発生させるすべてのAPIがエラーであったからです。

+0

で作業しないように見えます! failメソッドは、ajax呼び出し中に何かが失敗したときに実行されます。有効な応答を引き続き送信するサーバー側のエラーは、エラーとはみなされません。サーバ側のコードが失敗した場合は、無効なコンテンツや400ヘッダなどを渡すことによって失敗メソッドをトリガできますが、失敗したメソッドをトリガするものは本当にありますが、doneメソッド内から呼び出すことはできません。どちらかを行う。 – adeneo

+1

どのように適切ではありませんか?未来/約束/タスクがエラーコールバックを引き起こすことはむしろ一般的です。 –

+0

はい、ただし、約束事を作成した場合、失敗メソッドをトリガーすることはできますが、ajaxコールでは、サーバーからの有効な応答が成功したajax呼び出しである間に、 。サーバーサイドで発生したエラーは、期待どおりの処理を実行できなかった場合は、成功ハンドラで検出されます。あるいは、それは、その時点までに約束がすでに解決されているので、doneメソッドからfailメソッドをトリガーできないので、通常はやり方で行われます。 – adeneo

答えて

4

私はこれを行う方法を考え出し、それがうまく動作:今、私は私の完了に扱う厄介なデータエラーを持っていない魔法のように

$.get(URL) 
.then(
    function (data, status, res) { 
     if(/**some error check**/({ 
      return $.Deferred().reject(res, status, "error message"); 
     } 

     return $.Deferred().resolve(data, status, res); 
    } 
) 
.done(
    function (data, status, res) { 
     //Do stuff on success 
    } 
) 

.fail(
//Common error handler here 
) 
.always(
    //common always handler here 
); 

作品、私はちょうど処理データに焦点を当てることができますまたはエラーメッセージを設定します。

0

この質問とChrisの回答ありがとうございます。

テストしたAJAXの例外ではなく、暗黙的な予期しない例外(バグの原因)のために失敗関数をトリガしていたことを除いて、これを試しました。これは私には、新しい約束事オブジェクトを作成するという面倒なことなしに、明示的な例外のために働くかもしれないと思った。だから私は明示的なスローを試みるが、それはうまくいった。

この明示的なスローはjQuery 3で機能します。以前のバージョンについてはわかりません。私はdoneハンドラ内でこれをやってみました、それが動作しませんでした:投げるだけで何がないthenハンドラ

$.get(URL) 
.then(
    function (data, status, res) { 
     if(/**some error check**/({ 
      throw "error message"; 
     } 

     return data; //this is also important 
    } 
) 
.done(
    function (data, status, res) { 
     //Do stuff on success 
    } 
) 

.fail(
//Common error handler here 
) 
.always(
    //common always handler here 
); 
関連する問題