【问题标题】:Any way to gracefully enforce a timeout limit when loading a slow external file via javascript?通过javascript加载慢速外部文件时,有什么方法可以优雅地强制执行超时限制?
【发布时间】:2011-01-02 12:45:09
【问题描述】:

我正在使用 javascript 来包含从另一台服务器上的 php 文件提供的一些内容。然而,这个其他服务有时会变得不稳定,要么需要很长时间才能加载,要么根本不会加载。

在 JS 中是否有办法在失败并显示“请重试”消息之前尝试在 x 秒内获取外部数据?

<script type="text/javascript" src="htp://otherserver.com/myscript.php"></script>

【问题讨论】:

  • ...另外...我的服务器不支持 php(或其他任何东西 .. 它是 Yahoo 商店)并且它与我要从中提取的远程服务器位于不同的域中
  • 我认为除了让 sur eyou 将特定的 javascript 放置在页面上尽可能低的位置之外,没有其他方法可以做到这一点,以便在您等待时加载页面的其余部分。跨度>

标签: javascript html ajax timeout external


【解决方案1】:

这纯粹是纯理论:

&lt;script&gt; 标签可以动态插入到 DOM 中,此时将获取并处理脚本。这种动态脚本标签注入就是一些实现跨域“AJAX”的方式。

我想你可以声明一个全局变量var hasLoaded = false;。在您尝试加载的脚本结束时,您可以将该变量设置为 true hadLoaded=true;。将脚本标签注入 DOM 后,您可以启动 setTimeout(),其回调函数检查“hasLoaded”是否设置为 true。如果不是,您可以假设脚本尚未完全加载到浏览器中。如果有,您可以假设它已完全加载。

同样,这是理论上的,但如果你测试它一定要报告回来,我很好奇。

【讨论】:

  • 另外,我想知道从 DOM 中删除脚本标签是否会“取消”请求?可能不是我想的,而是另一个可以尝试的实验。
  • 我已经在脚本标签本身的加载中看到了这一点。值得一试。
【解决方案2】:

我能想到的唯一方法是在 另一个(启用 PHP)的服务器上创建一个代理,它会为您获取数据,但会在达到某个超时限制时停止达到(它可以只返回一个空结果)。

【讨论】:

    【解决方案3】:

    几个问题:您可以将超时阈值与XMLHttpRequest(又名ajax)一起使用,但是由于它位于otherserver.com 上,您不能使用XMLHttpRequest(并支持所有A 级浏览器),因为Same Origin Policy restriction .

    如果脚本引入了任何类型的全局名称(例如任何变量名、函数名等),您可以尝试setTimeout 继续检查:

    var TIMELIMIT = 5; // seconds until timeout
    var start = new Date;
    
    setTimeout(function() {
      // check for something introduced by your external script.
      // A variable, namespace or function name here is adequate:
      var scriptIncluded = 'otherServerVariable' in window;
    
      if(!scriptIncluded) {
        if ((new Date - start) / 1000 >= TIMELIMIT) {
          // timed out
          alert("Please try again")
        }
        else {
          // keep waiting...
          setTimeout(arguments.callee, 100)
        }
      }
    }, 100)
    

    我看到的问题是您无法取消对脚本的请求。如果我错了,请有人纠正我,但从 DOM 中删除 &lt;script&gt; 仍然会使浏览器对资源的请求处于活动状态。因此,尽管您可以检测脚本加载时间超过 x 秒,但您不能取消该请求。

    我认为你可能不走运。

    【讨论】:

      【解决方案4】:

      我认为这样做的唯一方法是通过 ajax 获取文件的内容,然后设置一个计时器。如果请求在计时器之前完成,您可以使用 eval 评估响应(这不是更好的解决方案),否则您可以停止 ajax 请求并编写错误消息。

      【讨论】:

      • 不能使用 AJAX。该脚本位于不同的域中。
      猜你喜欢
      • 2012-02-28
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      相关资源
      最近更新 更多