我是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)
函数来模拟延迟。我希望我的组件locationChoice1
,locationChoice2
和positionChoice
能够在1或2秒内更新,而我的test
组件将在8秒内更新,但所有组件都会在8秒内更新
这是正确的行为吗?
我尝试使用async
参数,但它没有改变结果。
答案 0 :(得分:17)
它们实际上是异步的(JS上下文没有被阻止;即你可以在同一时刻运行其他任意JS代码而不被阻止)。你看到的行为是因为他们排队了。所以看起来像就像它们不是异步的一样。
此排队行为在JSF 2 specification的第13.3.2节中指定:
13.3.2 Ajax请求队列
在将所有Ajax请求发送到客户端请求队列之前,必须将它们放入客户端请求队列中 服务器,以确保Ajax请求按发送顺序处理。已在队列中等待的请求 最长的是下一个要发送的请求。发送请求后,Ajax请求回调函数必须删除该请求 从队列(也称为队列)。如果请求成功完成,则必须将其从队列中删除。如果 出现错误,必须通知客户端,但仍必须从队列中删除请求,以便下一个请求 可以发送。必须发送下一个请求(队列中最早的请求)。请参阅
jsf.ajax.request
有关Ajax请求队列的更多细节的JavaScript文档。
这样做是为了确保JSF视图状态的完整性和线程安全性(并且因此本身也可以查看范围内的bean)。