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

时间:2012-12-06 15:13:11

标签: ajax jsf primefaces

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

1 个答案:

答案 0 :(得分:17)

它们实际上是异步的(JS上下文没有被阻止;即你可​​以在同一时刻运行其他任意JS代码而不被阻止)。你看到的行为是因为他们排队了。所以看起来像就像它们不是异步的一样。

此排队行为在JSF 2 specification的第13.3.2节中指定:

  

13.3.2 Ajax请求队列

     

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

这样做是为了确保JSF视图状态的完整性和线程安全性(并且因此本身也可以查看范围内的bean)。