我的应用程序有很多AJAX调用,每个调用都返回一个JSON响应。我没有验证每个.done()调用中的数据,而是试图压缩代码。
到目前为止我们有什么
$.ajax({
url: 'test',
type: 'GET',
data: {
_token: token
},
dataFilter: function(jsonResponse) {
return isValidJson(jsonResponse);
}
}).done(function(jsonResponse) {
// do things
});
isValidJson(jsonResponse) {
try {
var parsedJson = $.parseJSON(jsonResponse);
if (parsedJson.error == 1) {
notificationController.handleNotification(parsedJson.message, 'error');
return false;
}
} catch (err) {
notificationController.handleNotification('A server-side error occured. Try refreshing if the problem persists.', 'error');
return false;
}
return jsonResponse; // Have to return the original data not true
}
预期的行为是,如果dataFilter返回false,它将触发.fail(),如果返回true,则它将继续为.done()。相反,它继续使用isValidJson()的结果继续.done()。
是否还有一种方法可以使.fail()做一些标准的操作,例如向用户发送通知而不必将其置于每个AJAX调用之下?
答案 0 :(得分:2)
最简单的方法是通过扩展它来为$ .ajax创建一个速记。
扩展AJAX通话
jQuery.extend({
myAjax: function(params){
// Here we can modify the parameters and override them e.g. making 'error:' do something different
// If we want to add a default 'error:' callback
params.error = function() {
console.log('its failed');
};
// or you can specify data parse here
if (params.success && typeof params.success == 'function') {
var successCallback = params.success;
var ourCallback = function(responseJson) {
if (isValidJson(responseJson)) { // Validate the data
console.log('The json is valid');
successCallback(responseJson); // Continue to function
} else {
console.log('The json is not valid');
}
}
params.success = ourCallback;
}
return $.ajax(params);
}
});
现在每次想要在应用程序中进行AJAX调用时,都不要使用$ .ajax({})。相反,您使用$ .myAjax({});
示例强>
$.myAjax({
url: 'domain.com',
type: 'GET',
success: function(data) {
// Do what you'd do normally, the data here is definitely JSON.
},
error: function(data) {}
});
这个特殊函数将以相同的方式处理所有错误,不需要每次都写出这些验证器。
答案 1 :(得分:1)
尝试这样做( Not tested
):
var jxhr = $.ajax({
url: 'test',
type: 'GET',
data: {
_token: token
},
dataFilter: function(jsonResponse) {
if (!isValidJson(jsonResponse)) {
jxhr.abort();
}
return jsonResponse;
}
}).done(function(jsonResponse) {
// do things
});
答案 2 :(得分:1)
通过使用此策略 - 您违反"分离关注"策略。
Ajax应根据其操作解决或拒绝。如果响应是否为JSON则不符合。
可能的解决方案:(确定还有其他解决方案)
function GetSanitized(d) {
return d.then(function(a) {
if (a.indexOf('{') > -1) //check if json ( just for example)
return $.Deferred().resolve(JSON.parse(a)); //return object
else
return $.Deferred().reject(a); //reject
},
function() {
return $.Deferred().reject("ajax error"); //ajax failed
}
);
}
var ajax = $.Deferred();
GetSanitized(ajax) .then(function (a){alert(" Json p's value is "+a["p"]);},function (a){alert("Error"+a);});
ajax.resolve("{\"p\":2}"); //simulate ajax ok , valid json
//ajax.resolve("\"p\":2}"); //simulate ajax ok , invalid json
//ajax.reject("\"p\":2}"); //simulate ajax bad , valid json