我是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参数,但它没有改变结果。
发布于 2012-12-06 23:36:06
它们实际上是异步的(JS上下文不会被阻塞;也就是说,您可以同时运行其他任意JS代码,而不会被阻塞)。你看到的行为是因为他们在排队。因此,它们看起来好像不是异步的。
此排队行为在JSF 2 specification的13.3.2章中指定
13.3.2 Ajax请求排队在将所有Ajax请求发送到服务器之前,必须将其放入客户端请求队列中,以确保按发送顺序处理Ajax请求。在队列中等待时间最长的请求是下一个要发送的请求。发送请求后,Ajax请求回调函数必须从队列中删除请求(也称为出队)。如果请求成功完成,则必须将其从队列中删除。如果出现错误,则必须通知客户端,但仍必须从队列中删除该请求,以便可以发送下一个请求。必须发送下一个请求(队列中最旧的请求)。有关
jsf.ajax.request请求队列的更多细节,请参阅Ajax JavaScript文档。
这样做是为了确保JSF视图状态的完整性和线程安全性(并且本质上也是视图作用域bean)。
https://stackoverflow.com/questions/13746618
复制相似问题