我包装了jQuery AJAX请求/响应机制并实现了延期对象。
我这样做,从而为某些请求错误实现泛型处理程序,并允许我创建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
嘿,感谢您的链接,但我真的不明白进入它:Somenone提到尝试$ .ajaxSuccess(function(){// code});我也尝试过,但它不起作用! Firebug告诉我,它不是一个函数:-(也使用jQuery而不是$)任何想法为什么? –
如果认为它可能是'$ .fn.ajaxSuccess = function(){... $ .fn。的ajaxSuccess(); }'不知道想过但值得一试/检查 – Val
我不敢说这个发现:Ajax设置http://api.jquery.com/jQuery.ajax/ global:false!所以我有一个全局处理程序,当我不想在本地调用它时,我为全局设置全局:false。所以我解决了这个问题。 –