我正在运行一些jQuery代码突然间我通过Firebug控制台看到,当我强制500错误时,.fail()方法中的代码没有被触发:
$.ajax({
url: "someAction.do",
data: "param1=param¶m2=param",
dataType: "xml"
}).done(function(xml){
//some stuff with my data
}).fail(function(xml){
//some other different stuff with my data that is not being fired
});
另一方面,在Java Action中,我在发生错误时将HttpResponse Status设置为“500”,例如,通过Ajax调用POSTING一个无效字段,比如在数据库中搜索不是的电子邮件现在,然后通过ajax显示错误:
<xml version=bla,bla...>
<item>
<name>message</name>
<value>Invalid input data</value>
</item>
</xml>
。
任何想法为什么?我只想使用新方法 fail()和 done()。 我知道我可以使用statusCode处理程序来执行此操作。
但如果可以的话,我总是喜欢跟随新趋势。至少我想尝试一下。
非常感谢!
答案 0 :(得分:0)
替代方法,通过最初通过.done()
过滤回复,然后通过过滤延迟调用.fail()
或.always()
来替代直接调用.done()
或.fail()
;保持使用相同fail()
回调
// simulate server-side responses
var error = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<item>"
+ "<name>message</name>"
+ "<value>Invalid input data</value>"
+ "</item>";
var success = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<item>"
+ "<name>message</name>"
+ "<value>Success</value>" + "</item>";
// params
$.ajaxSetup({
beforeSend : function(jqxhr, settings) {
var d = decodeURIComponent(settings.data)
.match(/data=+.*/)[0]
.split(/=|&/);
var params = {};
params[d[0]] = {};
params[d[0]][d[1]] = d[2];
params[d[0]][d[3]] = d[4];
jqxhr.data = params;
}
});
var request = function (url, _xmlResponse, data1, data2) {
var _response = new $.Deferred(),
_request = $.ajax({
url: url,
type: "POST",
data: {
// responses
xml: _xmlResponse,
// params
data: "param1="+ data1 +"¶m2="+ data2
},
dataType: "xml"
});
// check `responseText` for "Invalid" ,
// check `textStatus` for actual net error , "error"
_request.always(function (xml, textStatus, jqxhr) {
console.log(xml, textStatus, jqxhr, "check");
// simulate server-side processing, cont.
// if both object passed to server ,
// `param1` and `param2` _do not_ have property
// with value of at `params` , `""` empty string - generic "error" ,
// _and_ returned `responseText` contain "Invalid" ,
// _or_ `textStatus` : `error` , `reject` `dfd` , call `.fail()`
// else `resolve `dfd` , call `.done()`
// check params
var test = [xml["data"] || jqxhr["data"]].every(function(v, k) {
return !(v.data["param1"] !== "" && v.data["param2"] !== "" )
}) ;
// check `xml` responseText for node for "Invalid" text ,
// generate `.fail()`
var check = $(xml.children)
.find("value").is(":contains(Invalid)");
return check && test || textStatus === "error"
// call `.fail()`
? _response.reject([xml, textStatus, jqxhr])
// call `.done()`
: _response.resolve([xml, textStatus, jqxhr])
});
return _response
.done(function (xml) {
// do `done()` stuff
console.log(xml[0], xml[1], xml[2]);
var msg = $(xml[0].children).find("value").html();
$("#success")
.html(msg + ", "
+ xml[2].data.data.param1
+ xml[2].data.data.param2
);
return this.promise()
})
.fail(function (xml) {
// do `.fail()` stuff
console.log(xml[0], xml[1], xml[2], "fail");
var msg = $(xml[0].children).find("value").html()
|| xml[1] + ", " + xml[2];
$("#error")
.html(msg);
return this.promise()
});
};
然后可以在没有request()
param的情况下调用_xmlResponse
,这应该处理生成的.fail()
(如果responseText
包含“无效”)和净错误.fail()
电话(例如statusCode
500
; textStatus
error
)和.done()
电话。
request("someAction.do", "param1_param", "param2_param");
可选地,链从promise
request
返回.always()
,data
数组包含request
个返回值;在.done()
或fail()
request("someAction.do", "param1_param", "param2_param")
.always(function(data) {
// do `.done()` , `.fail()` stuff ,
// `data, textStatus, jqxhr`
console.log(data[0], data[1], data[2])
})
答案 1 :(得分:0)
我认为这取决于参数“xml”,如果: 1. xml是一个真正的xml对象,它会触发'完成'; 2. xml不是xml对象,它会触发'fail'
即使你返回500错误代码,它仍然是一个有效的xml对象,所以它会触发“完成”