私はjQuery AJAX要求/応答メカニズムをラップし、遅延オブジェクトを実装しました。
要求が行われたときに私はと呼ばれる機能を操作できます。
- はの.done:成功ハンドラを要求
- .fail:障害ハンドラーを要求
ように私はこれをしませんでした特定のリクエストエラーのための汎用ハンドラを実装し、AJAXリクエストを作成して、レスポンスをより簡単に処理する機能を提供することができます。
私はコードでもう少し作業する必要がありますが、基本的な原則は、標準化された結果が維持されている限り、AJAXの実装を別の実装で削除できることです。つまり、別の開発者が独自のAJAX実装を実装するためにラッパーを使用することができ、システム全体のすべてのロジックが引き続き動作するはずです。
問題が正しく理解されている場合、このコードはシナリオに役立ちます。これはまだ完璧ではないし、あなたはそれを改善することができると確信しているが、私はそれが助けてくれることを願っている
私が考えることができるのは、AJAXリクエストオブジェクトがヘッダーで動作することだけです。私はそれが.done/.failでアクセス可能だと思う。そうでなければ、評価をすることができる。続き
は、AJAXラッパーへの呼び出しを行うために、JavaScriptのロジックです:ねえ、
var jqueryAJAXHandler = function ($) {
// private
function ResponseHandler(data) {
var dfd = $.Deferred();
var obj;
if (data.d) {
obj = JSON.parse(data.d, JSON.IsoDateReviver); // we use iso standard for date transmission hence the isoDateReviver.
} else {
obj = JSON.parse(data, JSON.IsoDateReviver); // we use iso standard for date transmission hence the isoDateReviver.
}
if (obj === null || obj.RequestStatus === null) {
// Every request made must respond with a requestStatus object as per standards.
// If obj is null it means that requestStatus was not added to the response OR
// an error occurred while chatting to the other server.
var failResult = {
RequestStatus: {
Status: 'error',
Type: 'malformedResponse',
Message: 'No Request Status object returned.'
}
};
dfd.reject(failResult);
return dfd.promise();
}
else if (obj.RequestStatus.Status === "error") {
// Everything is in order up to this point.
// we are now looking at a well formed response.
// we just do not know if the request for processing
// was successful.
// We now look at the requestStatus object to figure
// out if we were successful in proceessing.
// ACCESS RIGHTS or INVALID SESSION error handler
if (obj.RequestStatus.Type === "invalidSession") {
dfd.reject(null); // close off current deferred object.
return HelpejqueryAJAXHandlerr.GenericInvalidSessionHandler(obj); // return different promise.
}
else if (obj.RequestStatus.Type === "noAccess") {
dfd.reject(null); // close off current deferred object.
return jqueryAJAXHandler.GenericNoAccessHandler(obj); // return different promise.
}
dfd.reject(obj);
return dfd.promise(); // all other errors are handled by custom error handlers.
}
dfd.resolve(obj);
return dfd.promise();
}
// public
return {
GenericInvalidSessionHandler: function() {
window.location.href = obj.RequestStatus.Url;
return null;
},
GenericNoAccessHandler: function (obj) {
var dfd = $.Deferred();
// TODO : Implement generic no access rights error handler
// must work accross any page.
dfd.reject(obj);
return dfd.promise();
},
GenericErrorHandler: function (obj) {
var dfd = $.Deferred();
alert("An error occurred while processing your request. Please try again. If this issue continues please inform your manager.");
dfd.reject(obj);
return dfd.promise();
},
MakeServiceRequest: function (requestType, serviceURL, methodName, queryString, objData) {
var dfd = $.Deferred();
//#region MakeServiceRequest
// ORGANISE THE ARGUMENTS FOR THE REQUEST.
// ensure the session id always goes through.
var args = "";
var blnProcessData = false;
// convert arguments into JSON string for $.ajax request.
// arguments come after the 4 reqd parameters
//args =
// PROCESS URL
// put href into loc var for easy reading.
var loc = serviceURL + "/" + methodName;
if (queryString != "") {
loc = loc + "?" + queryString; //window.location.href;
}
// CALL WEB METHOD
$.ajax({
cache: false,
async: true,
type: requestType,
url: loc,
data: objData,
processData: blnProcessData,
contentType: "application/json;charset=utf-8",
dataType: "json"
})
.success(function (data, textStatus, jqXHR) {
ResponseHandler(data)
.done(function (obj) {
dfd.resolve(obj);
})
.fail(function (obj) {
dfd.reject(obj);
});
})
.error(function (jqXHR, textStatus, errorThrown) {
// XMLHttpRequest Failed.
var failResult = {
RequestStatus: {
Status: 'error',
Type: textStatus,
Message: errorThrown
}
};
dfd.reject(failResult);
});
return dfd.promise();
//#endregion MakeServiceRequest
}
}
}; // jqueryAJAXHandler
リンクのためのおかげで、私は実際に取得しない:
後は、AJAXラッパーですSomenoneが$ .ajaxSuccess(function(){// code})を試してみた。私も試したが、それは動作しません! Firebugは、それが関数ではないことを私に伝えています.-($の代わりにjQueryも使用しています)何らかの理由がありますか? –
もしそれが '$ .fn.ajaxSuccess = function(){... $ .fn。ajaxSuccess(); } '考えられていませんが、試してみる価値があるのですか? – Val
私はこれを発見したと言うことはできません:Ajaxの設定http://api.jquery.com/jQuery.ajax/ global:false!だから私はグローバルなハンドラを持っています。ローカルのハンドラで呼びたくないときは、グローバルに設定します:ローカルのハンドラをfalseにしました。 –