Jquery ajax error callback
我需要一些建议或者解释。我有一个jquery-ajax调用,
1 2 3 4 5 6 7 8 9 10
| $.ajax({
type:"GET",
url: base_url+'/ajax/fetch/counts/',
dataType: 'json',
data: {},
error: function(xhr, error){
console.debug(xhr); console.debug(error);
},
success: display_counts
}); |
它工作得很好。我的success回调会正确触发并响应。但是,我注意到我的error回调每次都会被触发,即使当我的调用返回success状态200时也是如此。在上面的error回调中,我看到对象xhr.status是200。
有人能解释出哪里出了问题,或者这里发生了什么吗?error回调应该只有在我有404或非200响应时才会触发。我的假设正确吗?
谢谢。
只是一个建议,尝试使用$.AjaxSetup()获得如下正确的错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| $(function() {
$.ajaxSetup({
error: function(jqXHR, exception) {
if (jqXHR.status === 0) {
alert('Not connect.
Verify Network.');
} else if (jqXHR.status == 404) {
alert('Requested page not found. [404]');
} else if (jqXHR.status == 500) {
alert('Internal Server Error [500].');
} else if (exception === 'parsererror') {
alert('Requested JSON parse failed.');
} else if (exception === 'timeout') {
alert('Time out error.');
} else if (exception === 'abort') {
alert('Ajax request aborted.');
} else {
alert('Uncaught Error.
' + jqXHR.responseText);
}
}
});
}); |
- 顺便提一句,docs state:note:全局回调函数应该用它们各自的全局Ajax事件处理程序方法设置,.ajaxstart()、.ajaxstop()、.ajaxComplete()、.ajaxerror()、.ajaxsuccess()、.ajaxsend()-而不是在$.ajaxsetup()的选项对象中。因此,这似乎更适合用于.ajaxError()
- 因此,要认识到的一件重要事情当然是,如果用户的互联网连接不稳定,您的Ajax可能会在用户的计算机上失败。因此,你的应用程序可以正常工作,但由于糟糕的互联网连接,它们会收到失败的Ajax请求——这似乎可以通过上面的status === 0和exception === 'timeout'案例来识别。
- 另请注意,docs声明:"这可能会导致不良行为,因为其他调用方(例如插件)可能期望正常的默认设置。因此,我们强烈建议不要使用此API。"
对HTTP错误调用错误回调,但如果响应上的JSON解析失败,也会调用错误回调。如果响应代码为200,但仍被抛出到错误回调,则可能会发生这种情况。
- 如果需要非JSON响应。您可以将datatype选项设置为script/text…etc checkout api.jquery.com/jquery.ajax并在datafilter下查找更多信息。
- 我在调用一个CGI脚本,我需要它以JSON格式转储数据。它返回了一个失败的字符串。
我能想到的一些事情:
通过设置cache: false确保已禁用缓存。
如果您正在使用火狐,请尝试使用firebug和net选项卡来监视请求。
不要依赖浏览器的JSON解析器。我推荐这个:https://github.com/douglascorkford/json-js/blob/master/json2.js,来自json的创建者
- "琐碎而明显"——嗯,那简直太苛刻了。:)
- 很抱歉,如果真的很严厉的话。+1已经用于引用JSON解析器。:)
- 开玩笑,没问题
- @simplecoder"不依赖浏览器的JSON解析器"?为什么?现在一样吗??
- @mfadel:一些旧的浏览器不支持JSON,因此首先使用第三方解析器可以防止兼容性问题。
我不是jquery专家,但我知道,对于prototype.js,如果请求成功,Ajax错误处理程序就会触发,但success处理程序会导致错误。jquery中也是这样吗?您可以通过将display_counts的全部内容放入一个try..catch块来测试是否发生了这种情况。
最近的一个问题与jsonjquery请求有类似的问题,请尝试从JSON响应中删除周围的()。
- 有趣的是,我有一个类似的问题,通过添加括号来解决。
- @Coronatus是的,这是我以前经常做的,但是jquery1.4.2开始依赖浏览器的JSON.parse,我的火狐的JSON.parse会成功解析{"key":"value"},但在({"key":"value"})上会发出一个错误。
- 为了解决浏览器解析JSON的差异,我建议使用DouglasCrockford的解析器:json.org/json2.js
将dataType由plain/text改为html。