Я обернул механизмы запроса / ответа jQuery AJAX и реализовал отложенные объекты.
Так что, когда сделан запрос, я могу работать с функцией под названием:
- .done: обработчик запроса запроса
- .fail: запрос обработчика ошибок
Я сделал это для того, чтобы реализовать универсальные обработчики для определенных ошибок запроса и позволить мне делать запросы AJAX и предоставлять функцию для обработки ответа более простым и менее загрязняющим способом.
Мне все еще нужно немного поработать над кодом, но основной принцип заключается в том, что реализацию AJAX можно удалить с помощью другой реализации, если стандартизированный результат остается на месте. Это означает, что другой разработчик может использовать оболочку для реализации своей собственной реализации AJAX, и вся логика в системах должна работать.
Этот код может работать для вас с вашим сценарием, если я правильно понимаю вашу проблему. Это еще не идеально, и вы можете улучшить это, я уверен, но я надеюсь, что это поможет.
Единственное, о чем я могу подумать, что вам может не хватать, это объект запроса AJAX для работы с заголовками. Я думаю, что он доступен в .done / .fail, иначе вы можете просто передать его, чтобы вы могли выполнить оценку.
Ниже приведена логика JavaScript для вызова оболочки AJAX:
AJAXHandler.MakeServiceRequest("POST", serviceUrl, method, queryString, jsonFilterArgument)
.done(function (requestResult) {
// Handle Request Success
if (requestResult.Data.Quote) {
var quote = requestResult.Data.Quote;
// handle quote
} else {
// handle no quote found
}
return this;
})
.fail(function () {
// handle Request Failure
return this;
});
Ниже приводится обертка AJAX:
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