日期:2014-05-16  浏览次数:20326 次

ext界面如何实时的去向服务端发送请求,并接受响应
小弟最近接了个需求,流程基本上是这样的,首先通过界面启动查询,然后将请求消息发送给socket服务端,然后socket的服务端会按照请求消息中的内容按照指定的时间像界面返回数据,然后将数据绘制成图表去呈现给客户。

  这样问题就来了,大家都知道web界面要接收数据,或者直接就说接收从服务端发来的响应,那么界面必须得给他一个请求,他才会发送给你响应了。他就是一个请求,对应一个响应,一般请求的触发的都是通过点击界面的按钮这样类似去做了,比如我界面就有一个"Start"按钮了,问题就在我界面的"Start"按钮只能点击一次,然后服务端就会定时的向界面发数据了,这个定时是不定的,他是根据请求内容中的消息规定的。

  为了能达到这个效果,就是点击一次按钮,然后不间断的接收服务端请求这种效果,我在Ext界面的start按钮处增加了一个定时器:代码大致为:
  var task = {  
  run: function(){  
  //这块是我的请求和,接收响应的代码
  },  
  interval: 2000 //2 second  
  }  
  Ext.TaskManager.start(task);  
 
  这样搞了以后,只要你点击了按钮,这个定时任务就触发了,然后就可以按照你指定的时间向服务端发请求,然后接收响应,并送给界面了。

  这样做,我们的需求算是实现了,但是问题很多啊,服务端正常向界面送数据的时间是根据请求消息规定的,他是1到8秒不定,但是界面只能写死的两秒去取次了,这样消息规定了两秒向界面送次数据,还好,你刚好你去取了,这是在服务端的时钟和界面时钟没有误差的情况下,要是有了偏差那就糟糕了!要是请求消息规定了一秒向界面送次数据,咱们两秒去取次,也还不算糟糕,大不了就掉个数据,或者延迟上几秒钟吗!也没啥!最糟糕的是服务端3秒,或者5秒等界面送次数据,那么界面两秒才去取次,那么将会遇到的要不是取不到数据,要不就是取到延时数据了。这些情况都是考虑界面时钟和服务器时钟没有偏差的时候了,真不敢想象当两侧是时钟有偏差时,他将会怎么样呢!

  这个问题太恼火了,一直没想到一个好的解决办法了,哎!其实我心里想的最好的处理办法就是当界面点击“Start”按钮后,正常的启动查询,然后可以一直等待服务端的响应,每当有数据来了,就向界面响应次,然后组装成图片展现给用户,这样的数据实时性问题就可以解决了,就不知道界面上怎么写了,郁闷啊!有哪位大侠知道咋么处理啊?
------解决方案--------------------
像这种特殊需求,服务端就不能特殊定制吗?服务端有针对请求的队列吗?
或者客户端这边可以异步接收服务端的响应吧?
------解决方案--------------------
这个如果是使用extjs的话,
一般来说有2中办法,

第一种使用abort方法,每当用户有新的请求的时候也就是你的Start按钮点击后, 把前面的ajax请求abort掉。
(言外之意,只响应最后一次的请求,前面的请求都被抛弃,注意这里是否会导致服务器请求队列的删除,请自行测试)
第二种当用户点击请求后,马上把窗体设置成loading状态,比如你的窗体的某个元素,Ext.getBody().mask('正在加载数据,请稍后。。。');
直到响应结束后,才unmask
------解决方案--------------------
象这种情况还是用服务端推送方式吧,即服务端生成数据时就立即向客户端发送。考虑使用DWR实现。