JSF/Primefaces AJAX 请求真的是异步的吗?

Posted

技术标签:

【中文标题】JSF/Primefaces AJAX 请求真的是异步的吗?【英文标题】:Are JSF/Primefaces AJAX requests really asynchronous? 【发布时间】:2012-11-24 15:49:20 【问题描述】:

我是JSF的新手,所以不知道我所面临的行为是否正常。

我有这个代码:

<p:selectBooleanCheckbox id="locationChoice1" value="#login.locationChoice1">
    <p:ajax listener="#login.chooseLocationType1" update="locationChoice1 locationChoice2 positionChoice" />
    <p:ajax listener="#login.retrieveGalaxies" update="test"  />
</p:selectBooleanCheckbox>

我的login.retrieveGalaxies 函数调用了sleep(8000) 函数来模拟延迟。我希望我的组件 locationChoice1locationChoice2positionChoice 将在 1 或 2 秒内更新,我的 test 组件将在 8 秒内更新,但所有组件都将在 8 秒内更新。

这是正确的行为吗?

我尝试使用async 参数,但它没有改变结果。

【问题讨论】:

【参考方案1】:

它们实际上是异步的(JS 上下文没有被阻塞;也就是说,您可以同时运行其他任意 JS 代码而不会被阻塞)。您看到的行为是因为他们在排队。所以它看起来好像它们不是异步的。

JSF 2 specification 的第 13.3.2 章规定了这种排队行为:

13.3.2 Ajax 请求队列

所有的 Ajax 请求必须先放入客户端请求队列,然后再发送到客户端 服务器确保 Ajax 请求按照发送顺序进行处理。一直在队列中等待的请求 最长的是要发送的下一个请求。发送请求后,Ajax 请求回调函数必须移除该请求 从队列中(也称为出队)。如果请求成功完成,则必须将其从队列中移除。如果 发生错误,必须通知客户端,但仍必须从队列中删除请求,以便下一个请求 可以发送。必须发送下一个请求(队列中最早的请求)。参考jsf.ajax.request 关于 Ajax 请求队列的更多细节的 javascript 文档。

这样做是为了确保 JSF 视图状态的完整性和线程安全性(因此本质上也是视图范围 bean)。

【讨论】:

好的,这是预期的行为,谢谢 BalusC。有什么方法可以同时触发多个 ajax 请求? 是的,但不是通过 JSF。使用普通的 jQuery+Servlet 左右。 在 p:ajax 上设置 async true 以便它不会排队。 @BalusC 所以在上面的例子中,有两个ajax请求排队,第一个会在1秒或2秒内处理完,所以还是没有解释为什么要等待同样的时间。 我猜只有一个ajax请求。

以上是关于JSF/Primefaces AJAX 请求真的是异步的吗?的主要内容,如果未能解决你的问题,请参考以下文章

JSF primefaces文件上传问题

JSF(Primefaces)通过ID更新几个元素的ajax

JSF/PrimeFaces ajax 更新破坏了 jQuery 事件侦听器函数绑定

jsf+primefaces开发配置

JSF Primefaces TabView 问题

JSF PrimeFaces overlayPanel 提交值