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

JSF/Primefaces AJAX请求真的是异步的吗?,ajax,jsf,primefaces,Ajax,Jsf,Primefaces,我是JSF新手,所以我不知道我面临的行为是否正常 我有以下代码: <p:selectBooleanCheckbox id="locationChoice1" value="#{login.locationChoice1}"> <p:ajax listener="#{login.chooseLocationType1}" update="locationChoice1 locationChoice2 positionChoice" /> <p:ajax

我是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>

My
login.retrieveGalaxies
函数调用
sleep(8000)
函数模拟延迟。我希望我的组件
locationChoice1
locationChoice2
positionChoice
在1或2秒内更新,我的
test
组件在8秒内更新,但都在8秒内更新

这是正确的行为吗


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

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

本标准第13.3.2章规定了这种排队行为:

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


这样做是为了确保JSF视图状态的完整性和线程安全性(以及固有的视图范围bean)。

好的,这是预期的行为,谢谢你,巴卢斯。有没有办法同时触发多个ajax请求?是的,但不是通过JSF。使用普通的jQuery+Servlet。在p:ajax上设置async true,使其不排队。@BalusC因此,在上面的示例中,两个ajax请求排队,第一个请求将在1或2秒内处理,因此仍然无法解释它为什么等待相同的时间。我猜只有一个ajax请求。