我正在从我的浏览器(IE、Mozilla、Chrome)向我的 Java 应用程序发出 jQuery AJAX jsonp 异步请求。如果我在 4 分钟内没有回复,则所有浏览器上的请求都会超时。如果超时,IE 会自动触发新请求,Mozilla 会简单地终止该请求。我不希望请求超时(我的意思是它应该等到响应不是来自服务器)有没有办法可以禁用 jQuery AJAX JSONP 请求的超时?
一些网站建议将超时值设置为太大作为解决方法,我不想使用它,因为它仍然会在很长一段时间后超时。
我正在从我的浏览器(IE、Mozilla、Chrome)向我的 Java 应用程序发出 jQuery AJAX jsonp 异步请求。如果我在 4 分钟内没有回复,则所有浏览器上的请求都会超时。如果超时,IE 会自动触发新请求,Mozilla 会简单地终止该请求。我不希望请求超时(我的意思是它应该等到响应不是来自服务器)有没有办法可以禁用 jQuery 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 分钟(服务器端),但我不会让它更长。
我的方法包括设置服务器、客户端和数据库。
创建一个数据库,该数据库使用时间附加器存储唯一的哈希键。那是客户端请求密钥。它包含您正在寻找的数据块的数据块,或者一个布尔值以了解该请求是否已完成。
服务器端:当客户端调用此请求时,存储其唯一密钥并开始处理事件。在该过程完成之前,第二列将有一个错误。完成后,您将该表翻转为真。
客户端:使用 ajax 请求 ping 服务器,然后在该请求的成功调用中使用超时并随着时间的推移创建一个请求链,这将检查数据库以查看该过程是否完成。在内部请求中,超时需要每 4 分钟一次或任何您喜欢的时间,但是当它返回成功时,它将具有所需的数据,您会想要删除计时器。如果它不返回 true,则将调用错误函数,什么也不做。
这个双重请求系统将允许您触发请求并随着时间的推移对其进行监控。完成后,您将拥有所需的内容。该系统将删除超时,因为它正在触发 1 个请求,然后将随着时间的推移触发检查请求。
这就是我将如何解决它,以便没有超时。没有挂起的进程挂起数据获取等。
编辑:您希望他们运行一个清理脚本,该脚本将从您所做的数据库表中删除该行,以及与不浪费空间相关的所有其他内容。