2012-11-17 92 views
3

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

有些网站建议设置超时值太大,因为我不想使用此解决方法,因为尽管经过很长时间后仍会超时。

+0

没有人注意到这一点?这个问题怎么样? – srain

+0

为什么你应该保持这么长时间的请求?在我们的网站,我们只保持55秒,然后关闭连接,建立新的 – srain

回答

1

另一种选择,可以说不像websockets那样先进​​,就是轮询一个地址的结果。考虑以下情况:

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

我建议你不要试图对付浏览器超时和幻想的javascript规避行为。即使您有时会使用它,但由于人们使用不同的浏览器(即使是现在的移动设备)也会出错。有一个强大的解决方案可以保持简单和可维护性。

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

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分钟(服务器端),但我不会让时间更长。

1

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

创建存储与时间apender一个唯一的哈希键的数据库。这是客户端请求密钥。它包含你正在寻找datawise的数据块,或者一个布尔值来知道这个请求是否完成。

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

客户:中国平安与Ajax请求的服务器,然后在要求使用超时的成功呼叫,并创造超过时间的请求,这将检查数据库,看看这个过程完成链。在内部请求中,超时需要像每4分钟一次或任何你喜欢的,但是当它返回成功时,它将具有期望的数据,并且你想要移除定时器。如果它不返回true,那么错误函数将被调用,只是无所事事。

这doouble要求系统将允许您触发一个请求,并监视它随着时间的推移。当它完成后,你将有你在找什么。这个系统会消除超时,因为它正在发出1个请求,然后随着时间的推移会触发检查请求。

这是我应该怎样解决这个问题,使得没有超时。无挂流程挂起的数据抓取等

编辑:你想他们运行清理脚本这会从你做的数据库表中删除该行,和所有其他的东西,这是有关不浪费空间。

+0

这是方式复杂恕我直言,包括数据库似乎只是总矫枉过正 –

+0

它不是太糟糕了,因为过程仍然可以运行不同的是他们的链接方式。用户只需将运行脚本的结论与JS的回调关联起来即可。它肯定会解决手头的问题。 – Fallenreaper