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请求监视工具查看请求/响应来验证您的请求的响应是否正在缓存。

+0

没办法。即使在我没有得到超时工作之前......成功处理程序被调用并且数据主体为空。这种行为与safari有关吗? – gotch4 2010-09-01 08:54:15

我遇到同样的问题。

我发现它取决于超时时间有多长。使用chrome的时间少于2000毫秒,一切都按预期工作,但是对于更大的超时,成功处理程序不会被调用。

+0

我结束了写给官方的jQuery论坛,他们提交它作为一个错误(一个开发人员想让我做一些测试,他最终将它分类为一个bug)。无论如何,这是八月份的情况,如果他们确定了结果,我没有很好地跟踪结果。无论如何,我记得我最终使用了一些解决方法,即使我不记得哪一个。索兹 – gotch4 2011-04-01 07:55:17