我正在从我的浏览器(IE,Mozilla,Chrome)向我的Java应用程序发出jQuery AJAX jsonp异步请求。如果我的回复在4分钟内未提供,则请求会在所有浏览器上超时。如果超时,IE会自动触发新请求,Mozilla会终止该请求。我不希望请求超时(我的意思是它应该等到响应不是来自服务器)有没有办法可以禁用jQuery AJAX JSONP请求的超时?
有些网站建议将超时值设置得太大,作为我不想使用的解决方法,因为在很长一段时间后仍会超时。
答案 0 :(得分:2)
另一种选择,可以说不像websockets那样先进,是为了调查结果的地址。请考虑以下情形:
您需要在屏幕上显示报告,但加载需要很长时间。您可以将初始请求发送到服务器。然后,服务器启动报告,并返回客户端可以轮询结果的uri。客户端然后轮询该uri并且(可能)获得404直到报告完成。报告完成后,可以在uri上访问它,然后您可以将其显示在浏览器中。
我建议你不要试图反对浏览器超时和花哨的javascript规避。即使你有时让它工作,它也会容易出错,因为人们使用不同的浏览器(现在甚至是移动浏览器)。拥有一个强大的解决方案可以保持简单和可维护。
正如@BalusC所提到的,网络套接字很适合这种东西。如果你愿意稍微改变你的范例并且有时间掌握,那么这是一个很好的解决方案。网络肯定会这样。但是,如果你受到时间压力,短期内可能不是最佳解决方案。
答案 1 :(得分: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分钟(服务器端),但我不会比这更长。
答案 2 :(得分:1)
我的方式是设置服务器,客户端和数据库。
创建一个数据库,该数据库存储带有时间扩展器的唯一哈希键。这是客户端请求密钥。它包含您正在寻找数据方式的数据块,或者一个布尔值来知道该请求是否已完成。
服务器端:当客户端调用此请求时,存储其唯一键并开始处理该事件。在该过程完成之前,第二列将具有错误。完成后,将该表翻转为true。
客户端:使用ajax请求ping服务器,然后在该请求的成功调用中使用超时并随时创建一系列请求,这将检查数据库以查看进程是否已完成。在内部请求中,超时需要像每4分钟一次或任何你喜欢的,但当它返回成功时,它将具有所需的数据,你会想要删除计时器。如果它不返回true,那么将调用错误函数,只是什么都不做。
这个双重请求系统允许您触发请求并随着时间的推移进行监控。完成后,您将拥有所需的内容。该系统将删除超时,因为它正在触发1个请求,然后将随着时间的推移触发检查请求。
这是我如何解决它,以便没有超时。没有挂起的进程等待数据提取等。
编辑:您希望他们运行一个清理脚本,该脚本会从您执行的数据库表中删除该行,以及与不浪费空间相关的所有其他内容。