2012-06-01 9 views
12

私は$.ajaxと約束しています。私の(構文的に有効な)応答にエラーが含まれているかどうかをチェックし、その場合に拒否ステータスをトリガーします。jQueryの遅延オブジェクトにエラーを投げる

私はこのようなタスクを簡単に処理する私の約束のライブラリを使用しています。私は実際にjQueryのPromisecache)の実装がDeferred objectであるとは思わないし、めったに使用しないので、何か見落としている可能性があります。

return $.ajax(...).then(function success(response) { 
    var problem = hasError(response); 
    if (problem) { 
     var error = new $.Deferred; 
     error.reject(problem); 
     return error; 
    } else 
     return response; 
}); 

これは、応答でネットワークエラーや問題が発生した場合には拒否された約束を返す必要があります:私は進むべき道はただ複雑であるように思われ、.then()を使用していると思います。しかし、拒否された延期は本当に[最善の|最短の]道を行くのですか?

私はまた、このような「エラーを投げるレスポンスハンドラ」をajaxのオプションで処理する方法について助言してくれると思います。


免責事項:いいえ、私はサーバーの応答を変更できません。問題検出方式は同期方式です。私は他のライブラリを使いたくないので、特にjQueryがこれを解決する方法に興味があります。

+0

OK:

$.ajax() .then(function (response) { return $.Deferred(function (deferred) { var problem = hasError(response); if (problem) { return deferred.reject(problem) } deferred.resolve(response); }).promise(); }); 

は、その後、これを消費するものは何でも、呼び出し元のコードにこの新しい約束を返すことができますjQuery :-( – Bergi

+0

Jquery 1.8 pipe === then – Plynx

+0

ありがとうございました彼らは少なくとも固定されています – Bergi

答えて

31

は今、これを取り組むための最も簡単な方法は、データの成否に基づいてフィルタリングする.thenを通じて$.ajaxの応答を実行することであるjQueryの1.8+

のために更新します。 .then() `私は.pipeは()`でない `という事を意味し`て、

var request = function() { 
    return $.ajax() 
     .then(function (response) { 
      return $.Deferred(function (deferred) { 
       var problem = hasError(response); 

       if (problem) { 
        return deferred.reject(problem) 
       } 

       deferred.resolve(response); 
      }).promise(); 
     }); 
}; 

request() 
    .done(function (response) { 
     // handle success 
    }) 
    .fail(function (problem) { 
     // handle failure 
    }); 
+0

パイプとそれ以外の違いは何ですか? – Bergi

+1

'pipe'は、登録済みのプロミスハンドラに送られる前に、遅延値をフィルタリングすることができます。 'then'は、約束が解決または拒否されたときにハンドラを登録するために使われます。 – Eli

+1

いいえ、[仕様別](http://webcache.googleusercontent.com/search?q=cache%3awiki.commonjs.org/wiki/Promises/A).then()はそれを正確に実行します。または、jQueryがこれを投げてメソッド名を入れ替えたのですか? – Bergi