【问题标题】:How to disable timeout for AJAX JSONP request?如何禁用 AJAX JSONP 请求的超时?
【发布时间】:2013-07-26 04:23:01
【问题描述】:

我正在从我的浏览器(IE、Mozilla、Chrome)向我的 Java 应用程序发出 jQuery AJAX jsonp 异步请求。如果我在 4 分钟内没有回复,则所有浏览器上的请求都会超时。如果超时,IE 会自动触发新请求,Mozilla 会简单地终止该请求。我不希望请求超时(我的意思是它应该等到响应不是来自服务器)有没有办法可以禁用 jQuery AJAX JSONP 请求的超时?

一些网站建议将超时值设置得太大作为解决方法,我不想使用它,因为它仍然会在很长一段时间后超时。

【问题讨论】:

  • 没人注意到这个吗?这个问题怎么样?
  • 为什么要让请求运行这么长时间?在我们的网站上我们只保留 55s,然后我们关闭连接,建立新的

标签: jakarta-ee jquery browser jsonp


【解决方案1】:

另一个可能不如 websockets 先进的选项是轮询地址以获取结果。考虑以下场景:

您需要在屏幕上显示报告,但加载时间较长。您可以将初始请求发送到服务器。然后服务器启动报告,并返回一个客户端可以轮询结果的 uri。客户端然后轮询该 uri 并将(可能)获得 404,直到报告完成。报告完成后,可以通过 uri 访问它,然后您可以将其显示到浏览器中。

我建议您不要试图反对浏览器超时和花哨的 javascript 规避的刺激。即使你有时让它工作,它也容易出错,因为人们使用不同的浏览器(现在甚至是移动浏览器)。拥有一个强大的解决方案可以使事情保持简单和可维护。

正如@BalusC 提到的,Web 套接字非常适合这类东西。如果你愿意稍微改变你的范式并且有时间在你手上,那么它是一个很好的解决方案。网络肯定会这样发展。但是,如果您有时间压力,这可能不是短期内的最佳解决方案。

【讨论】:

    【解决方案2】:

    我认为无论如何你都不能让请求超时然后优雅地处理它,因为你已经注意到究竟发生了什么取决于浏览器,你几乎无法控制。

    但是,我认为解决方案相当简单,只是不要让您的请求超时。

    您可以毫不费力地更改您的 java 应用程序中的 jsonp 回调处理程序,以通知客户端超时期限已过并且它应该再次执行请求。

    我创建了一个功能齐全的工作示例来准确地向您展示我的意思。

    这个例子是在 nodejs 中,但我认为服务器端的实现应该保持最小。更多的是关于客户端代码的作用。

    演示:
    http://jsonp-timeout.herokuapp.com/

    来源:
    https://github.com/helmus/jsonp-timeout/blob/master/public/index.html

    这真的是所有相关代码:
    基本上你把你的 jsonp 调用放在一个函数中,这样你就可以重用它。如果您的处理程序随后收到 "timeout" 响应,它可以轻松地再次发出请求,直到您的服务器确定其他操作相关。

    $(function(){
        $("#call").on("click", function(){
            var makeJsonpCall = function(){
                return $.ajax({
                    url: "rpc.js",
                    dataType: "jsonp"
                });
            };
            var handler = function(data){
                if (data === "timeout") {
                    console.log("a timeout occured, forwarding your request");
                    makeJsonpCall().done(handler);
                    return;
                }else{
                    console.log("request completed");
                }
            };
            makeJsonpCall().done(handler);
        });
    });
    

    我认为这种方法确实足够强大,并且允许您以最小的更改保持您的接口,并且如果端点支持它,它仍然可以与跨域 jsonp 一起使用。
    您可以将超时时间更改为 2 或 3 分钟(服务器端),但我不会让它更长。

    【讨论】:

      【解决方案3】:

      我的方法包括设置服务器、客户端和数据库。

      创建一个数据库,该数据库使用时间附加器存储唯一的哈希键。那是客户端请求密钥。它包含您正在寻找的数据块的数据块,或者一个布尔值以了解该请求是否已完成。

      服务器端:当客户端调用此请求时,存储其唯一密钥并开始处理事件。在该过程完成之前,第二列将有一个错误。完成后,将该表翻转为 true。

      客户端:使用 ajax 请求 ping 服务器,然后在该请求的成功调用中使用超时并随着时间的推移创建一个请求链,这将检查数据库以查看该过程是否完成。在内部请求中,超时需要每 4 分钟一次或任何您喜欢的时间,但是当它返回成功时,它将具有所需的数据,并且您需要删除计时器。如果它不返回 true,则将调用错误函数,什么也不做。

      这个双重请求系统允许您触发一个请求并随着时间的推移对其进行监控。完成后,您将拥有所需的内容。此系统将删除超时,因为它正在触发 1 个请求,然后会随着时间的推移触发检查请求。

      这就是我将如何解决它以便没有超时。没有挂起的进程等待数据获取等。

      编辑:您会希望他们运行一个清理脚本,该脚本将从您所做的数据库表中删除该行,以及与不浪费空间相关的所有其他内容。

      【讨论】:

      • 这是一种复杂的恕我直言的方式,包括数据库似乎完全是矫枉过正
      • 这还不算太糟糕,因为进程仍在运行,不同之处在于它们的链接方式。用户只需将运行脚本的结论绑定到数据库而不是 JS 回调。它肯定会解决手头的问题。
      猜你喜欢
      • 2014-01-15
      • 2017-07-22
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多