【问题标题】:Can a timeout be initiated for script loading when the server is down?当服务器关闭时,是否可以为脚本加载启动超时?
【发布时间】:2015-05-05 14:37:57
【问题描述】:

有没有办法在服务器不可用时更快地使请求超时?我通过脚本标签请求一个文件,该文件在 21 秒后超时,此时页面尝试在没有它的情况下构建。请求的状态码是 502:Bad Gateway while server down.

我正在从已启动且运行良好的服务器向暂时处于羽翼未丰状态的服务器发出请求。正常的请求是这样的:

<script language="JavaScript" src="...someFileOnTheDownServer..."></script>

当请求尝试加载文件时,我的主页面的加载会阻塞并等待不会被提供的文件。

我可以异步加载文件,但这也会显示为“加载”状态,直到 21 秒过去。我宁愿只等待 2-5 秒来尝试检索文件。

这个问题看起来rather similar,但我认为5年后应该有更好的选择,更多关于这个主题的问题,或者一个真正的解决方案,在我指定的延迟时超时&lt;script&gt;标签。

我还没有看到 timeout 属性 on the MDN 的脚本标签。有没有人对 HTML5 async 属性有很好的经验?我宁愿不无限期地使用async,因为我更喜欢加载此文件然后渲染页面的体验......不要等待21秒

更新

为了使异步成为一个选项,需要有一种方法可以在加载请求的文件后立即执行某些特定于页面的 javascript 代码。

我测试了async 属性,并且(对于兼容的浏览器)页面呈现时不会阻塞和等待文件。但是,我需要一些特定于页面的代码在页面加载后而不是之前运行。 This answer 似乎提供了一个解决方案,但我更喜欢的答案是能够以指定的时间间隔使脚本加载超时。

【问题讨论】:

    标签: javascript jquery timeout


    【解决方案1】:

    也许您可以使用 ajax 请求。

    $.holdReady( true );
    function getScr (timeout) {
    jQuery.ajax({
          url: "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.2/moment.min.js",
          dataType: "script",
          cache: true,
        error: function(x, t, m){
        if(t==="timeout") {
            console.log("got timeout");
        } else {
            console.log(t);
        }
    
          $.holdReady( false );
        },
        success: function(){
              console.log( "added" );
    $('#date').text(moment().format("dddd, MMMM Do YYYY, h:mm:ss a"));
          $.holdReady( false );
        },
        timeout: timeout
    })}
    getScr(3000);
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    Date : <div id="date"></div>

    http://api.jquery.com/jQuery.holdReady/

    【讨论】:

    • 谢谢你的想法;我已经试过了。超时确实会在timeout:timeoutt === "timeout" 之后触发错误函数。但是,脚本请求一直在发出,浏览器继续等待,直到 21 秒过去才停止尝试。即使到达错误回调,也可能无法强制取消请求。
    • 我希望x.abort() 会停止这个过程,但它还没有奏效。
    • 您所说的“但是,脚本请求一直在运行,并且浏览器继续等待 21 秒后停止尝试”是什么意思? .请求将在达到超时时停止,不是吗?看一下这个 。 jsfiddle.net/sg9y6c8u 。在此示例中,我已在此处禁用缓存以查看每次单击时的更改。
    • 其实并没有。我得到了与您对脚本的期望相同的行为,但是对于我们的服务器今天所处的特定停机时间配置(它正在修复中),请求在达到超时时并没有停止(尽管 error 函数已输入)。调用abort 也没有杀死它!无论出于何种原因,浏览器一直尝试从不可用的服务器下载内容(持续 21 秒),这比我的 3 秒超时完成时长了 18 秒。
    猜你喜欢
    • 2021-12-16
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 2021-04-06
    相关资源
    最近更新 更多