11

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

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

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

4 回答 4

3

几个问题:您可以将超时阈值与XMLHttpRequest(又名 ajax)一起使用,但是由于同一来源策略限制otherserver.com,您无法使用XMLHttpRequest(并且支持所有 A 级浏览器)。

如果脚本引入了任何类型的全局名称(例如任何变量名称、函数名称等),您可以尝试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)

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

我想你可能不走运。

于 2010-01-07T15:22:04.600 回答
2

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

于 2010-01-07T15:36:18.847 回答
0

这纯粹是纯粹的理论:

<script>标签可以动态插入到 DOM 中,此时将获取并处理脚本。这种动态脚本标签注入是如何实现跨域“AJAX”的。

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

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

于 2010-01-07T21:01:14.850 回答
-1

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

于 2010-01-07T15:19:57.257 回答