10

我是 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参数,但它没有改变结果。

4

1 回答 1

19

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

这种排队行为在JSF 2 规范的第 13.3.2 章中指定:

13.3.2 Ajax 请求队列

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

这样做是为了确保 JSF 视图状态的完整性和线程安全(因此也固有地查看范围 bean)。

于 2012-12-06T15:36:05.900 回答