【问题标题】:Failed to load resource: Request timed out on Safari加载资源失败:Safari 上的请求超时
【发布时间】:2015-09-17 08:44:49
【问题描述】:

我们的 Web 应用程序现在可以在大多数浏览器上正常运行一年多。 最近我们发现它在 Safari 上运行不佳。

很多操作最终都会出现以下错误:Failed to load resource: Request timed out。有趣的是动作实际上是正确执行的之后(大部分时间)。

查看错误时,似乎是有 ajax 请求时发生的。

首先我尝试通过执行以下操作来更改 ajax 超时设置:

 $.ajax({
      "type"      : methode,
      "dataType"  : "json",
      "url"       : url,
      "async"     : async,
      "data"      : donneesEnvoyees,
      "timeout"   : 60000
 })

这并没有改变任何东西,错误实际上是在大约 10 秒后出现的,小于定义的超时时间。

在互联网上阅读了一些内容后,我看到了一些关于指定 no-cache 的答案,以便 safari 不会将 post 参数保留在缓存中。 我不能说我完全理解这一点,但我仍然尝试了以下方式:

$.ajax({
     "type"      : methode,
     "headers"   : { "cache-control": "no-cache" }, <-- added this line
     "dataType"  : "json",
     "url"       : url,
     "async"     : async,
     "data"      : donneesEnvoyees,
     "timeout"   : 60000
 })

如你所料,我仍然遇到同样的错误。

你知道发生了什么吗?为什么这个错误只发生在 Safari 而不是其他浏览器上?如何解决?

【问题讨论】:

  • js变量'methode'、'url'、'async'、'donneesEnvoyees'的值是多少?你在哪里调用ajax?任何涉及正则表达式的地方?
  • 方法是 POST 或 GET。 url 是动作,async 在所有请求中大多是“false”,“donneesEnvoyees”是 post 参数。我在提交时调用 Ajax,没有涉及正则表达式。
  • 你的ajax有error()函数吗?如果可以,您可以将其包含在问题中吗?
  • 我想我遇到过这样的事情。能否给出服务器的预期返回值?
  • @AminJafari 我的 ajax 没有 'error()' 函数,但有 'fail()' 函数。如果服务器发回一些数据,错误会显示在带有响应的对话框中,但在我的情况下,服务器不会发回任何数据。

标签: jquery ajax web safari timeout


【解决方案1】:

在您的 ajax 设置中设置 async: true。它将使浏览器保持连接并在收到响应后关闭。

【讨论】:

  • 这适用于可以是异步的请求,但有时它是不可能的。无论如何,为什么 safari 会对同步请求做出这种反应?
  • 根据我的经验和研究,Safari 只是自己覆盖了 ajax 设置上提供的超时,使用 10 秒。
  • 奖励您赏金,因为您的回答有助于解决某些请求(不是全部)。我仍然不明白发生了什么以及如何真正修复它(也有同步请求)。
【解决方案2】:

如果您从代码中删除dataType : "json",我认为您的问题将得到解决如果您的ajax 页面的返回不是正确的JSON 字符串。我注意到如果提供了dataType : "json" 并且返回数据不是JSON 类型,则$.ajax() 不会转到成功函数。

PS
有些东西,比如 AJAX 设置关键字 type, dataType, url 等不应该用双引号引起来。即使代码即使使用当前的方式也可以工作,但我提到的是正确的方式。

$.ajax({
      type      : methode,
      dataType  : "json",
      url       : url,
      async     : async,
      data      : donneesEnvoyees,
      timeout   : 60000,
      success   : function(data){
                alert('success');
      }
});

我假设您已经通过这个 ajax 调用添加了一个 success 函数,您可以使用它来根据结果使用不同的操作。

【讨论】:

  • 返回值始终是正确的 JSON 字符串,所以我认为这不是问题所在。关于你的假设,我没有“成功()”功能,但有“完成()”功能
【解决方案3】:

我遇到了同样的问题。通过将 CORS 标头和响应状态代码添加为 200

进行了修复
 res.header('Access-Control-Allow-Origin', '*');
 res.status(200);

方法和原因

通过阅读 jQuery 的源代码深入了解错误后,我意识到真正的问题是 jQuery+Safari 中的 XMLHttpRequest 调用 onError 并带有 http 状态码0。所以我添加了CORS头并给它一个200状态码来解决问题。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 2017-02-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多