在执行jQuery.ajax()
或complete
之前,是否可以在error
中处理来自服务器的JSON响应?
或者让我延伸一下这个问题:
在处理JSON数据(每个响应属性)时,告诉$.ajax()
它是success
和complete
AJAX请求,还是error
,所以{ {1}}被执行了吗?
示例Psuedocode:
$.ajax({error: function() {} });
为什么你会问?因为我想在任何地方使用单个$.ajax({
url: 'script.php',
type: 'POST',
data: {some: 'data-1'},
dataType: 'json',
process: function(data) {
if(data.success == true && (data.data.length > 0)) {
this.success = true;
} else {
this.success = false;
}
},
success: function() {
if( this.success == true ) {
// it was a success
}
},
error: function() {
if( this.success == false ) {
alert('there was an error');
}
}
});
语法,并且只应随时更改$.ajax()
。
答案 0 :(得分:0)
是的
function setDefaultPoint(){
var officeId = $('#clientTrip_officeId').val();
$.ajax({
url:"${createLink(controller:'clientTrip',action:'setDefaultPoint')}",
dataType: "json",
data: { officeId: officeId },
success: function(data) {
console.log(data.defaultPoint.id, data.defaultPoint.name);
console.log(data.company.id, data.company.name);
}
});
}
答案 1 :(得分:0)
简单的答案是否定的,除非您想编写自己的JSON解析器。
使用标准的jQuery功能,AJAX成功和错误处理程序将分别响应成功/不成功的数据检索而触发,而不考虑数据的正确性,而不是形成良好的JSON。
数据仅提供给成功处理程序,因此如果要对其进行过滤,则必须在其中进行。
好消息是,您可以使用$.Deferred()
在您自己的控制下获得所需的操作,并在两个处理程序中的任何一个中解决/拒绝以响应您选择的任何条件。这通常在返回Deferred的承诺的函数内部完成。
代码将是这样的:
function getData() {
var dfrd = $.Deferred();
$.ajax({
url: 'script.php',
type: 'POST',
data: {some: 'data-1'},
dataType: 'json'
}).done(function(data, textStatus, jqXHR) {
if(data.success == true && (data.data.length > 0)) {
dfrd.resolve(data, textStatus, jqXHR);
} else {
dfrd.reject(jqXHR, "client-side error", "data.success==false and/or data.data.length==0");
}
}).fail(dfrd.reject);
return dfrd.promise();
}
因此,该函数执行您需要的附加检查,并且返回的promise会模拟jqXHR的完成/失败特征。
需要更多考虑让返回的承诺具有jqXHR的全部功能 - 例如。 .abort()
方法。
答案 2 :(得分:0)
ajax事件有全局事件处理程序:
$(document).ajaxComplete() //called when Ajax requests complete
$(document).ajaxError() //called when Ajax requests complete with an error
$(document).ajaxSend() //executed before an Ajax request is sent
$(document).ajaxStart() //called when the first Ajax request begins
$(document).ajaxStop() //called when all Ajax requests have completed
$(document).ajaxSuccess()
//function to be executed whenever an Ajax request completes successfully
以及ajax设置:
$(document).ajaxSetup({
url: 'script.php',
type: 'POST',
data: '{}',
dataType: 'json'
});
然后你可以打电话:
$.ajax({ data: myData });
它使用以上所有
这是一个使用asp.net的例子,它发送回.d属性,然后将其转换为你需要的JSON:
$(document).ajaxSetup({
data: "{}",
dataType: "json",
type: "POST",
contentType: "application/json",
converters: {
"json jsond": function(msg) {
return msg.hasOwnProperty('d') ? msg.d : msg;
}
},
error: function(xhr, textStatus, errorThrown) {
var errorMessage = "Ajax error: " + this.url
+ " : " + textStatus + " : " + errorThrown
+ " : " + xhr.statusText + " : " + xhr.status;
alert(errorMessage);
if (xhr.status != "0" || errorThrown != "abort") {
alert(errorMessage);
}
}
});
注意:此转换器在成功或完成之前执行 - 因此我“认为”这就是您所要求的。