我是 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
and positionChoice
1 或 2 秒内更新,我的test
组件要在 8 秒内更新,但全部都是在 8 秒内更新。
这是正确的行为吗?
我试着玩async
参数,但没有改变结果。
它们确实是异步的(JS 上下文不会被阻止;即您可以同时运行其他任意 JS 代码而不会被阻止)。您看到的行为是因为它们已排队。所以看起来像就好像它们不是异步的一样。
该排队行为在第 13.3.2 章中指定JSF 2 规范 http://jcp.org/aboutJava/communityprocess/final/jsr314/index.html:
13.3.2 Ajax 请求排队
所有 Ajax 请求在发送到客户端之前都必须放入客户端请求队列中
服务器以确保 Ajax 请求按照发送顺序进行处理。一直在队列中等待的请求
最长的是下一个要发送的请求。发送请求后,Ajax请求回调函数必须删除该请求
从队列中(也称为出队)。如果请求成功完成,则必须将其从队列中删除。如果
发生错误,必须通知客户端,但该请求仍必须从队列中删除,以便下一个请求
可以发送。必须发送下一个请求(队列中最旧的请求)。请参阅jsf.ajax.request
有关 Ajax 请求队列的更多详细信息的 JavaScript 文档。
这样做是为了确保 JSF 视图状态的完整性和线程安全性(本质上也是视图作用域 bean)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)