Java 在一系列小时间范围内处理来自同一客户机的多个请求
我开发了一个web应用程序,其中包含一个仪表板,可以根据用户选择显示各种报告和图表 为用户提供了复选框和单选按钮,用于根据需要对报告进行操作。在选择每个复选框和单选按钮时,我将进行一个ajax调用,以显示与选择相对应的报告 我面临的问题是,当用户以很小的时间间隔(几分之一秒或一秒)一个接一个地单击多个复选框/单选按钮时,请求会以一系列的方式发送到服务器,服务器会以相同的顺序响应它们 例如,如果我有两个单选按钮,一个用于饼图,另一个用于折线图,并且用户在一系列小的时间间隔内同时单击这两个按钮,则服务器将首先显示饼图,并且在几毫秒内它将被折线图覆盖 是否有一种机制可以让我覆盖最新的 请求超过所有先前的请求 注意事项:Java 在一系列小时间范围内处理来自同一客户机的多个请求,java,javascript,ajax,jakarta-ee,request,Java,Javascript,Ajax,Jakarta Ee,Request,我开发了一个web应用程序,其中包含一个仪表板,可以根据用户选择显示各种报告和图表 为用户提供了复选框和单选按钮,用于根据需要对报告进行操作。在选择每个复选框和单选按钮时,我将进行一个ajax调用,以显示与选择相对应的报告 我面临的问题是,当用户以很小的时间间隔(几分之一秒或一秒)一个接一个地单击多个复选框/单选按钮时,请求会以一系列的方式发送到服务器,服务器会以相同的顺序响应它们 例如,如果我有两个单选按钮,一个用于饼图,另一个用于折线图,并且用户在一系列小的时间间隔内同时单击这两个按钮,则服
定义一个间隔,基本上是一个较长的自制
事件循环
,以批处理或仅发送最新请求:
var timeoutID
function formChangeHandler() {
clearTimeout(timeoutID)
timeoutID = setTimeout(function() {
// send data to server
}, 1000);
}
这只是许多可能的方法中的一种,在这种情况下,服务器只会在1000毫秒没有活动的情况下接收数据。嗯,我认为有两种不同的方法来处理这个问题 正如其他用户所说,第一种可能是使用一点延迟
- 优点:不会发送第一个请求(节省服务器负载)
- 缺点:请求总是延迟的,因此用户必须等待,尽管他提出了一个单独的请求
- 优点:请求可以实时处理
- 缺点:请求总是发送到服务器
var xhr = null; // handles the current request
function sendRequest(){
if(xhr && xhr.readyState != 4){
// When a request is made and another is ongoing, abort the previous
xhr.abort();
}
xhr = $.ajax({
.
.
. // Request parameters
done: function(data){
// do something
}
});
}
所以,如果我在您的示例中理解得很好,正确的行为应该是只显示折线图?为什么不在向服务器发送请求之前添加延迟?也就是说,用户点击单选按钮->js客户端正在排队等待事件->用户点击其他按钮->js客户端重写最后一个事件->用户1秒不做任何事情->js客户端发送最后一个请求。@A-Tomy-k:是的,因为最新的请求是线条图,所以正确的行为应该是显示线条图。@PBSpecchnyi:我相信,延迟只会减慢这个过程。例如,如果用户在一秒钟后做出更改,它仍然会执行这两个请求。1秒只是一个重复出现的常见间隔。@VirajPai,是的,这不会阻止所有不必要的请求,但这会减少需要服务的请求量。此外,这将阻止您的客户端在每个用户单击时重新绘制ui。这似乎是我需要的,但因为我使用的是
dojo.event.topic.publish(“showtprogressReport”)代码>我没有得到任何返回类型。所以我只是想知道,是必须使用jquery ajax还是可以继续使用Struts2 ajax?我不知道我是否做得对。但我刚刚试过:var xhr=null;函数submitForm()showtprogressReport“;}}};}
请建议,因为它似乎只是第一次发布。我从未使用过Dojo,因此我无法真正帮助它。正如您所说,Dojo.publish似乎没有返回任何内容。您的代码是错误的,因为您不需要使用JQuery($.ajax)来进行ajax调用(发布会自动完成)。检查此页面,您可能会发现一些有用的内容。connect.subscribe返回一个处理程序。执行connect.unsubscribe(处理程序)可能有效