JQuery $ .ajax在超时而不是错误时调用成功方法,在Safari中运行
我注意到Safari中这种奇怪的jQuery行为。建立呼叫这样后:
$.ajax({
'url' : url,
'dataType' : 'json',
data : reqdata,
timeout: 20000, //10 secs of timeout
success : function(data, textStatus, XMLHttpRequest) {
console.log("success");
if ((data === null) || (data.length == 0)) {
ts.doAction({
'actionName' : 'timeout',
'request' : {
'reqdata' : reqdata,
'actionName' : actionName,
'url' : url
},
'controller' : ts
});
}
ts.doAction({
'actionName' : actionName,
'data' : data
});
},
error : function(XMLHttpRequest, textStatus, errorThrown) {
console.log("error: " + textStatus);
if (textStatus == "timeout") {
ts.doAction({
'actionName' : 'networkFailureError',
'request' : {
'reqdata' : reqdata,
'actionName' : actionName,
'url' : url
},
'controller' : ts
});
} else {
ts.doAction({
'actionName' : 'serverError',
'request' : {
'reqdata' : reqdata,
'actionName' : actionName,
'url' : url
},
'controller' : ts
});
}
}
});
如果发生超时(我切换本地网络服务器关闭),“成功”的方法将被调用!在textStatus参数中比这更多的是一个带有“成功”的字符串!错误处理程序甚至不会被调用....(正如你可能注意到我必须告诉问题的唯一方法是检查数据参数,如果它是null或0长度...为什么这种行为?我避免这种
听起来像你的请求被缓存
尝试$.ajax
呼叫与cache: false
选项设置每个API docs:。
如果设置为false就会迫使 页您请求不要被浏览器缓存的 。
您可能还想通过使用Firebug,Fiddler或其他一些Web请求监视工具查看请求/响应来验证您的请求的响应是否正在缓存。
我遇到同样的问题。
我发现它取决于超时时间有多长。使用chrome的时间少于2000毫秒,一切都按预期工作,但是对于更大的超时,成功处理程序不会被调用。
我结束了写给官方的jQuery论坛,他们提交它作为一个错误(一个开发人员想让我做一些测试,他最终将它分类为一个bug)。无论如何,这是八月份的情况,如果他们确定了结果,我没有很好地跟踪结果。无论如何,我记得我最终使用了一些解决方法,即使我不记得哪一个。索兹 – gotch4 2011-04-01 07:55:17
没办法。即使在我没有得到超时工作之前......成功处理程序被调用并且数据主体为空。这种行为与safari有关吗? – gotch4 2010-09-01 08:54:15