5.5. 请求排队,请求不会丢失

在OperaMasks 2.3及之前的版本中,如果某次AJAX请求执行尚未处理完毕,同一form中又有另一AJAX请求发送,则后发送的请求会被抛弃。

这样用户无法简单地在在一次动作(比如:点击一个按钮或双击数据表格的一行)中发送两个请求来执行两段不相关的代码。要想实现对应的功能,需要用js或Java代码将两个请求由并联改为串联,操作较为复杂,而且性能也不好。

OperaMasks 3.0中增加了请求排队的机制,允许用户用较简单的代码来让同一Form中的请求按发送的先后顺序排队,在服务器端得到处理。

OperaMasks 3.0版本起,Form默认会进行请求排队,确保当用户连续快速提交时,不会出现同步冲突或丢失请求。由于引入排队机制后请求会在请求队列中等待,所以可能会超时,默认的超时时间为无限大(即不会超时),用户可以自己设置超时时间,在请求超时后还会执行用户的JavaScript代码。如下代码:

   <w:form timeout="2000" ontimeout="alert('请求超时了!');">
      <w:button label="模拟点击另外两个按钮" onclick="t1Jsvar.fireEvent('click');t2Jsvar.fireEvent('click');" />
      <w:button id="t1" label="按钮1" jsvar="t1Jsvar" />
      <w:button id="t2" label="按钮2" jsvar="t2Jsvar" />
    </w:form>

点击第一个按钮,会用js模拟点击第二个和第三个按钮,发送2个AJAX请求,请求会进行排队(第二个按钮的请求在前,第三个按钮的请求在后,第一个按钮的请求在最后),如果某个请求在2000毫秒后还得不到处理,则会抛弃访请求,并执行ontimeout中的js代码,弹出alert提示框(而在3.0以前的版本中,第二个请求会被直接抛弃,因为两个请求连续发送且属于同一form,在这段时间内第一个请求不可能响应完成)。

关于请求排列的更多信息请参考第 18.5 节 “请求排队”