【发布时间】:2026-01-29 10:45:02
【问题描述】:
是否可以使用 JSF 进行将同时执行的 ajax 调用(在开始新的调用之前不等待之前的调用完成)?
【问题讨论】:
是否可以使用 JSF 进行将同时执行的 ajax 调用(在开始新的调用之前不等待之前的调用完成)?
【问题讨论】:
不,它们是按规范明确排队的,没有任何例外。见JSF 2 specification的第13.3.2章:
13.3.2 Ajax 请求队列
所有的 Ajax 请求必须先放入客户端请求队列,然后再发送到客户端 服务器确保 Ajax 请求按照发送顺序进行处理。一直在队列中等待的请求 最长的是要发送的下一个请求。发送请求后,Ajax 请求回调函数必须移除该请求 从队列中(也称为出队)。如果请求成功完成,则必须将其从队列中删除。如果 发生错误,必须通知客户端,但仍必须从队列中删除请求,以便下一个请求 可以发送。必须发送下一个请求(队列中最早的请求)。参考
jsf.ajax.request关于 Ajax 请求队列的更多细节的 JavaScript 文档。
这样做是为了确保服务器端视图范围 bean 的线程安全。
【讨论】:
<a4j:queue>,MyFaces 中使用 jsf.js)。这可能会对您有所帮助。
为了防止页面或某些表单的所谓 View-State 出现问题,AJAX 请求被序列化。
JSF-Extensions (https://www.intersult.com/wiki/page/JSF%20Ext) 让您可以选择并行化 AJAX 请求。只需将 JavaScript 变量 jsf.ajaxQueue 设置为默认值 1 以外的另一个值。但是,如果您不手动锁定来自同一表单内的重复请求或同一区域的渲染,则会出现错误。
这是您激活并行请求的方式:
<script type="text/javascript">
if (jsf)
jsf.ajaxQueue = 2;
</script>
例如,您可以使用
【讨论】: