我正在从我的浏览器(IE,Mozilla,Chrome)向我的Java应用程序发出jQuery AJAX jsonp异步请求。如果我的回复没有在4分钟内出现,请求会在所有浏览器中超时。如果超时,IE自动触发新的请求,Mozilla只是终止该请求。我不希望请求超时(我的意思是它应该等到响应不来自服务器)有没有办法可以禁用jQuery AJAX JSONP请求的超时?如何禁用AJAX JSONP请求超时?
有些网站建议设置超时值太大,因为我不想使用此解决方法,因为尽管经过很长时间后仍会超时。
我正在从我的浏览器(IE,Mozilla,Chrome)向我的Java应用程序发出jQuery AJAX jsonp异步请求。如果我的回复没有在4分钟内出现,请求会在所有浏览器中超时。如果超时,IE自动触发新的请求,Mozilla只是终止该请求。我不希望请求超时(我的意思是它应该等到响应不来自服务器)有没有办法可以禁用jQuery AJAX JSONP请求的超时?如何禁用AJAX JSONP请求超时?
有些网站建议设置超时值太大,因为我不想使用此解决方法,因为尽管经过很长时间后仍会超时。
另一种选择,可以说不像websockets那样先进,就是轮询一个地址的结果。考虑以下情况:
您需要在屏幕上显示报告,但加载需要很长时间。您可以将初始请求发送到服务器。服务器然后启动报告,并返回客户端可以轮询结果的URI。然后,客户调查该uri,并将(可能)获得404,直到报告完成。报告完成后,它将在uri中访问,然后您可以将其显示在浏览器中。
我建议你不要试图对付浏览器超时和幻想的javascript规避行为。即使您有时会使用它,但由于人们使用不同的浏览器(即使是现在的移动设备)也会出错。有一个强大的解决方案可以保持简单和可维护性。
正如@BalusC提到的,网络套接字非常适合这类东西。如果你愿意改变你的范例并且有时间放在你的手上,那么它是一个很好的解决方案。网络肯定会这样。但是,如果您受到时间压力,这可能不是短期内的最佳解决方案。
我不认为你可以让请求超时然后处理,因为你已经注意到浏览器到底发生了什么,你几乎没有任何控制。
但是,我认为解决方案非常简单,只是不要让您的请求超时。
只需很少的努力,您可以在您的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分钟(服务器端),但我不会让时间更长。
我的方式包括设置服务器,客户端和数据库。
创建存储与时间apender一个唯一的哈希键的数据库。这是客户端请求密钥。它包含你正在寻找datawise的数据块,或者一个布尔值来知道这个请求是否完成。
服务器端:当客户端调用这个请求,存储它的唯一密钥,并开始处理该事件。在这个过程完成之前,第二列将会有错误。完成后,将该表翻转为真。
客户:中国平安与Ajax请求的服务器,然后在要求使用超时的成功呼叫,并创造超过时间的请求,这将检查数据库,看看这个过程完成链。在内部请求中,超时需要像每4分钟一次或任何你喜欢的,但是当它返回成功时,它将具有期望的数据,并且你想要移除定时器。如果它不返回true,那么错误函数将被调用,只是无所事事。
这doouble要求系统将允许您触发一个请求,并监视它随着时间的推移。当它完成后,你将有你在找什么。这个系统会消除超时,因为它正在发出1个请求,然后随着时间的推移会触发检查请求。
这是我应该怎样解决这个问题,使得没有超时。无挂流程挂起的数据抓取等
编辑:你想他们运行清理脚本这会从你做的数据库表中删除该行,和所有其他的东西,这是有关不浪费空间。
这是方式复杂恕我直言,包括数据库似乎只是总矫枉过正 –
它不是太糟糕了,因为过程仍然可以运行不同的是他们的链接方式。用户只需将运行脚本的结论与JS的回调关联起来即可。它肯定会解决手头的问题。 – Fallenreaper
没有人注意到这一点?这个问题怎么样? – srain
为什么你应该保持这么长时间的请求?在我们的网站,我们只保持55秒,然后关闭连接,建立新的 – srain