最近在公司碰到点难题。关于点击button拿到最新的汇率。
之前的需求是客户端AJAX请求为同步,async=false.点击一次按钮,在前一个请求没有返回以前,不发出新的请求的。
$.ajax({ url: "test.html", async:false, success: function(){ //todo } });
后来需求需要客户端ajax请求异步。async:true。比如:连续点击10次,响应错误显示error message和成功返回更新数据都只与最后ajax请求相关。
1.那么怎么处理知道是最后一次请求呢??
设一个时间戳,记住最后一后请求的时间,
$.ajax({ url: "test.html", async:true, time:new Date(), success: function(){ //todo },error:function(){ } });
服务端不改变time的值,返回来。success里面比较一下时间就行了。
2.error message处理。
如果是timeout error message呢。如何判断是最后一次的error呢。根本不可能返回time param.
讨论了许久,有个比较垃圾的方式:lastSuccess=false,如果最后一次成功返回,就lastSuccess=true.
在error里面,if(lastSuccess==fasle){显示error message}.
特殊情况,如果第一次失败,那么会show error message.第二次成功了,那么会清除error message,然后更新数据。
3.考虑一种极端情况,如果点击三次,倒是最后一次请求最先返回,有可能吗?如果有可能,那么上面分析的逻辑是对的吗?
我用Thread.sleep()的方式来unit test。一直不成功。ajax响应会按请求的顺序返回。
我的debug的方法,把前一个ajax response请求hold住,后面也一个请求居然排队??
为什么呢。servlet不是对于每个请求会有一个新的servlet吗??
4.请问,两个用户访问同一个servlet,如果a用户的请求没有返回,b的请求可以发出吗?a,b同一台机器同一browser?
同一个pc,不同browser??不同pc呢?
5.难道servlet对于同一session的用户,请求是单线程的??
6.jquery.ajax{async:true},只是表示客户端是多线程的,服务器端不确定?