ので、2016年のようにAPIでjQueryのAJAXを使用するためのクリーンな方法は、約束を返すことです。しかし、呼び出し元がエラーハンドラを約束に添付しているかどうかを判断することはできません。
だから、私がお勧めしたいことは、あなただけの呼び出し側がエラー処理の世話をするため、デフォルトのエラー処理を適用しないように機能を告げるあなたの関数に新しい引数を追加することです。
function request(method, uri, params, proxies, skipDefaultErrorHandling){
// default error handling will be used if nothing is passed
// for skipDefaultErrorHandling
var p = $.ajax({
data: method=='GET'?params:JSON.stringify(params),
contentType: 'application/json',
dataType: 'json',
url: api.root + uri,
type: method,
xhrFields: {
withCredentials: true
}
});
if (!skipDefaultErrorHandling) {
// apply default error handling
p = p.then(null, function(jqXHR, textStatus, errorThrown) {
// put here whatever you want the default error handling to be
// then return the rejection with the various error parameters available
return $.Deferred().reject([jqXHR, textStatus, errorThrown]);
});
}
return p;
};
その後、呼び出し側はちょうど自分自身のエラー処理を適用したりするかどうかを決定:そして、私はあなただけ$.ajax()
が既に返し、既存の約束を使用してのではなく、あなた自身が延期作成することにより、約束アンチパターンを避けることをお勧めしたいですない:
request(...).then(function(data) {
// success code here
});
それとも、あなたが渡す非約束failHandler
コールバックして、デフォルトのエラー処理で行くことができるfailHandler
が渡されたかどうかを確認します。これは約束とコールバックのハイブリッドであると私は通常、建築家を選ぶのでしょうものではありませんが、あなたの質問には対応していない約束何かを要求するので、これはそれを達成するための一つです:
function request(method, uri, params, proxies, failHandler){
// default error handling will be used if nothing is passed
// for skipDefaultErrorHandling
var p = $.ajax({
data: method=='GET'?params:JSON.stringify(params),
contentType: 'application/json',
dataType: 'json',
url: api.root + uri,
type: method,
xhrFields: {
withCredentials: true
}
});
// apply default error handling
p = p.then(null, function(jqXHR, textStatus, errorThrown) {
if (failHandler) {
// call passed in error handling
failHandler.apply(this, arguments);
} else {
// do your default error handling here
}
// then keep the promise rejected so the caller doesn't think it
// succeeded when it actually failed
return $.Deferred().reject([jqXHR, textStatus, errorThrown]);
});
return p;
};
繰延オブジェクトは動作しません。そうですね。代わりに、グローバル・エラー・ハンドラを用意し、そのajaxリクエストのグローバル・イベントを無効にします。 –
ここでは '$ .Deferred'インターフェースを使用しないでください。 '$ .ajax()'によって返された約束について、 'then'メソッド(古いjQueryバージョンでは' pipe')を呼び出してください! – Bergi
(http://api.jquery.com/ajaxError/)グローバル[ 'ajaxError'イベント]あります、そしてあなたは([$ .ajaxSetup'']使用することができますhttp://api.jquery.com/jQuery.ajaxSetup /)を使用します。 – Bergi